我正在尝试将静态 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 Bluepixy ,const 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/