在C中动态分配的数组上调用free()似乎正在更改存储在另一个数组中的数据?

问题描述 投票:2回答:2

我有以下C代码:

char *a, *b;
int count;
a = malloc(10);
b = malloc(10);
for(count=0;count<10;count++){
  b[count] = 'a';}
memcpy(&a, &b, 10);
for(count=0;count<10;count++){
  printf("%c %c\n", a[count], b[count]);}
free(b);
for(count=0;count<10;count++){
  printf("%c, ", a[count]);}

但是,在输出中,似乎通过释放b:删除了数组a的前8个元素:

./a.out
a a
a a
a a
a a
a a
a a
a a
a a
a a
a a
, , , , , , , , a, a,

有人可以尝试解释一下这里发生了什么吗?我似乎找不到发生这种情况的原因。

c arrays dynamic-memory-allocation
2个回答
2
投票

我实际上无法重现您的问题(在Visual Studio / MSVC中,但是此行引起了一个问题(几乎肯定是未定义的行为):

memcpy(&a, &b, 10);

ab变量是已经指针,因此您不需要将它们的地址传递给memcpy。只需使用:

memcpy(a, b, 10);

在您的代码中,您可能会覆盖存储在两个指针或两个指针中的地址值。

编辑:clang-cl编译器发现了问题,给出了这个:

警告:“ memcpy”将始终溢出;目标缓冲区的大小8,但size参数为10 [-Wfortify-source]


2
投票

free(b)没问题,行:

memcpy(&a, &b, 10);

应该是:

memcpy(a, b, 10);

[ab已经是指向内存位置的指针,您不应传递它们的地址,这将导致不确定的行为。

© www.soinside.com 2019 - 2024. All rights reserved.