gpt4 book ai didi

c - 指针周围存在大量内存泄漏

转载 作者:行者123 更新时间:2023-11-30 18:36:02 24 4
gpt4 key购买 nike

我正在尝试将静态 3D 字符数组 (e) 中的所有内容复制到动态数组 (C) 中。编译并启动 gdb 后,我注意到 *C[0] 中包含的地址更改为错误的地址。

 *C[0] = <0x601030>
*C[0] = <0x60105000601030>
*C[0] = <0x60105000601030>
*C[0] = <0x60105000601030>
*C[0] = <0x60105000601030>
*C[0] = <0x60105000601030>

这是程序代码:

int
main ()
{
#define I 2
#define J 3

int *C[I];

const char *e[I][J] = {{"aa", "bb", "cc"}, {"dd", "ee", "ff"}};

for (int i=0; i<I; i++)
{
int *P = malloc(sizeof(int)*J);
C[i] = P;
for (int j=0; j<J; j++)
{
char *p;
p = malloc(strlen(e[i][j])+1);
strcpy(p, e[i][j]);
P[j] = p;
char **ptx = C[0];
printf("*C[0] = <%p>\n", *ptx);
}
}
}

上面给定的代码中应该有什么问题?

最佳答案

首先,as suggested by Bluepixyconst char *e[J][I] 应该是 const char *e[I][J]

即使在那之后,您的代码也会调用 undefined behavior 。看这里

  char **ptx = C[0];

您将 ptx 定义为 char **,然后您(尝试)使用 int 初始化它 (它本身是一个实现定义的行为,整数到指针的转换),最后,您尝试取消引用该指针。

绝对不能保证您会取消引用有效内存,从而导致 UB。

故事的寓意:启用编译器警告并注意它们。

关于c - 指针周围存在大量内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43323497/

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