【问题标题】:Use the 2D pointer without allocation使用不分配的二维指针
【发布时间】:2019-01-19 03:11:23
【问题描述】:

在下面的 C 代码中,我为 **c 分配、初始化和定义值。我希望**assign 采用**c 的值。但是我只为**assign声明了一个二维指针,没有内存分配,代码运行成功,打印出和**c一样的结果。我不知道为什么?

int main(){

    int i,j;
    float **c=NULL, **assign=NULL;
    c = (float **)calloc(2,sizeof(float *));
    for (i=0;i<2;i++){
        c[i] = (float *)calloc(3,sizeof(float));
    }

    for (i=0;i<2;i++){
        for (j=0;j<3;j++){
            c[i][j] = i+j;
            printf("c[%d][%d]=%f\n",i,j,c[i][j]);
        }
    }

    assign = c;
    for (i=0;i<2;i++){
        for (j=0;j<3;j++){
            printf("assign[%d][%d]=%f\n",i,j,assign[i][j]);
        }
    }

    return 0;
}

【问题讨论】:

  • cassign 是指针,而不是数组。代码只是用assign = c; 分配一个指针。
  • 两个指针可以指向同一个内存。只要指向的内存被正确分配,这是完全安全的。您不必为每个指针单独分配。话虽如此,请注意,在 C 中说“代码运行成功”并不总是证明代码是正确的。未定义的行为通常看起来像大多数时间“成功运行”的代码。
  • @JohnColeman 所以你的意思是代码是正确的,但我的话不合理?
  • @james 我不知道你的代码是否正确。我没有运行它,也没有深入思考它。没有什么能对我产生影响。我只是想提醒一下,不要过多解读代码似乎正在运行的事实。

标签: c pointers dynamic-memory-allocation


【解决方案1】:

指针只是一个普通变量,它保存着其他东西的地址作为它的值。换句话说,一个指针指向可以找到其他东西的地址。

分配时:

c = calloc(2,sizeof(float *));

您将新内存块的起始地址分配给c。换句话说,c 指向内存中可以找到您分配的第一个(两个)指针的位置。

当你分配(动词)时:

assign = c;

您正在将assign 持有的值设置为c 持有的值。 (c 持有什么?- 使用calloc 分配的内存块的地址)。所以assign 现在拥有与c 相同的地址,例如assign 现在指向您分配的第一个(两个)指针。所以assignc 现在都拥有与其值相同的地址,您可以使用其中任何一个来引用存储在那里的内容。

注意:malloc的返回不需要强制,没有必要。请参阅:Do I cast the result of malloc?。此外,如果您使用取消引用的指针来设置分配的 type-size,则可以消除出错的机会,例如

c = calloc (2, sizeof *c);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 2016-08-06
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多