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

标签 c arrays pointers memory-management

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

相关文章:

c - 为什么编译器不生成错误 "lvalue required"?

pointers - 为什么 Deref::deref 的返回类型本身就是一个引用?

c - pthreads 线程间共享内存

c - 从 C 文件中删除最后一行 - 创建空行

arrays - Swift 4 排序有错误的元组

javascript - 为什么 JavaScript 中带有一元运算符++ 的变量在括号内的变量下次出现之前不会将变量更改 1?

c++ - 为什么两种情况下的行为不同 1st。整数 i = 1,2,3;和第二。诠释我;我 = 1,2,3;

c++ - 使用 LVM_SORTITEMSEX 将所有选定项目移动到特定项目下方

python - 从 numpy.where() 获取值的位置作为单个值并将其附加到另一个数组

c - malloc中sizeof的使用