我正在尝试执行下面的代码:
#include <stdio.h>
int main()
{
int var1 = 7;
int* ptr1 = &var1;
int* ptrHold = ptr1;
int memo = 0;
ptr1 = (int*)malloc(7*sizeof(int));
if(ptr1==NULL){
printf("Memory couldn't be allocated...");
exit(0);
}
else{
printf("Memory allocated for ptr1 = %d\n",7*sizeof(int));
printf("%d",(*(&ptr1+1)-ptr1));
for(int i=0;memo<=(*(&ptr1+1)-ptr1)/sizeof(int);i++){
*ptr1=i;
memo += (int)(sizeof(int));
ptr1++;
}
}
ptr1 = ptrHold;
for(int i=0;i<5;i++){
printf("%d \n",ptr1[i]);
}
free(ptr1);
return 0;
}
但是它给了我奇怪的输出,我认为这是因为我正在使用的循环条件:
memo<=(*(&ptr1+1)-ptr1)/sizeof(int)
我基本上是试图从下一个内存位置减去我的指针的值(它的地址),我将获得它所占用的内存。将其除以
sizeof(int)
后,我想我会得到分配给指针的内存(以字节为单位),并通过将 memo 变量增加 int 的大小,我将遍历指针并为每个块赋值。
这个个人计划没有目标,我知道它效率不高。我并不是想创建一个高效的程序,只是想深入理解一些概念。我可能犯了一个根本性错误,但我很困惑,我想了解为什么这段代码不起作用。
我的预期输出是:
Memory allocated for ptr1 = 28
0
1
2
3
4
你有:
memo <= ( *( &ptr1 + 1 ) - ptr1 ) ) / sizeof( int )
您希望循环在七遍后结束,也就是说当
memo <= ( 7 - 1 ) * sizeof( int )
为 true 时。
这个等式显然是错误的。只是没有办法总是得到常量 ( 7 - 1 ) * sizeof( int )
from a varying
ptr1`。
我基本上是试图从下一个内存位置减去我的指针的值(它的地址),我将获得它所需的内存。
不。这始终等于
1
。
采取以下代码:
uint32_t a[2];
int *p = &( a[0] );
int *q = &( a[1] );
它会产生如下内容:
int *p int a[2]
2000 +-----------+ 1000 +-----------+
| 1000 --------> | |
+-----------+ 1004 +-----------+
+--> | |
| +-----------+
int *q |
3000 +-----------+ |
| 1004 -----+
+-----------+
但是,虽然地址可能相隔 4 个字节,但指针之间的差异是 1。
printf( "%rd\n", p - q ); // 1