gpt4 book ai didi

c - 通过在 C 中分配整数数组来理解这种行为

转载 作者:行者123 更新时间:2023-11-30 14:55:55 26 4
gpt4 key购买 nike

我知道我应该使用 realloc 来增长数组,但一瞬间我就这样做了。我意识到这种方法是错误的,因为我在不分配数组的情况下通过增长堆来破坏堆。所以我本质上是在写垃圾。但是,当代码很小并且没有其他事情发生时,我不明白为什么这不起作用。我的前几个值都是垃圾

#include <stdio.h>
#include <stdlib.h>

int main()
{
int **p = NULL;
int i=0;
int size = 5;
int *n = NULL;

p = malloc(sizeof(int*));

printf("p = %p \n", p);

for( i=0; i < size; i++ )
{
int *k;
k = malloc(sizeof(int));
*k = i;
p[i] = k;
printf("%p, %p, val = %d \n", k, p[i], *k);
}

printf("Now print the array -- \n");
for( i=0; i < size; i++ )
{
int *k;
k = p[i];
printf("value at mem %p == %d \n", p[i], *k);
}

printf("now print the next values in p \n");
for( i=0; i < size; i++ )
{
printf("value at %p = %p \n", p+i, *(p+i) );
}

return 0;
}

这是代码的输出 -

p = 0x7f8ffbc031c0
0x7f8ffbc031d0, 0x7f8ffbc031d0, val = 0
0x7f8ffbc031e0, 0x7f8ffbc031e0, val = 1
0x7f8ffbc031f0, 0x7f8ffbc031f0, val = 2
0x7f8ffbc03200, 0x7f8ffbc03200, val = 3
0x7f8ffbc03210, 0x7f8ffbc03210, val = 4
Now print the array --
value at mem 0x7f8ffbc031d0 == -71290384
value at mem 0x7f8ffbc031e0 == -71290352
value at mem 0x7f8ffbc031f0 == 2
value at mem 0x7f8ffbc03200 == 3
value at mem 0x7f8ffbc03210 == 4
now print the next values in p
value at 0x7f8ffbc031c0 = 0x7f8ffbc031d0
value at 0x7f8ffbc031c8 = 0x7f8ffbc031e0
value at 0x7f8ffbc031d0 = 0x7f8ffbc031f0
value at 0x7f8ffbc031d8 = 0x7f8ffbc03200
value at 0x7f8ffbc031e0 = 0x7f8ffbc03210

我无法解释为什么前两个值是垃圾,即使 p 和 p+1 指向的内存地址是我放在那里的。

最佳答案

声明

p = malloc(sizeof(int*));

仅将单个元素分配给pp[1]p[4] 不存在(或者,更准确地说,您不拥有与这些元素对应的内存)。要分配 size 元素的 int * 数组,该行需要是

p = malloc( size * sizeof *p ); // sizeof *p == sizeof (int *)

另外,

int *k;
k = malloc(sizeof(int));
*k = i;
p[i] = k;

可以简单地写为

p[i] = malloc( sizeof *p[i] ); // sizeof *p[i] == sizeof (int)
if ( p[i] ) // **always** check the result of a malloc, calloc, or realloc call!
*p[i] = i;

关于c - 通过在 C 中分配整数数组来理解这种行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45202397/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com