在C中使用指针的地址作为循环条件

问题描述 投票:0回答:1

我正在尝试执行下面的代码:

#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
c pointers memory-management dynamic-memory-allocation dynamic-arrays
1个回答
0
投票

你有:

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
© www.soinside.com 2019 - 2024. All rights reserved.