函数中的malloc全局数组

时间:2017-09-02 10:50:57

标签: c

解决

为什么malloc W[51] load51()弄乱了W[50]内容?

typedef struct qword { short chap, chapPos, Sentence, nbLetters, gVal; char *L;} qword;

qword *W[73];

main() { load50(); load51(); }
load50() {    // This function is generated by a script that reads a txt file
  qword w;
  short chap = 50, p = 0;
  W[chap] = (qword *) malloc(376*sizeof(qword));

  // Fill every single qword in W[50]:
  //* (sentence 0, word 1)
  w.Sentence = 0; w.chapPos = ++p;
  { char B[] = {1, 12, 12}; w.L = B; }; w.nbLetters = 3; w.gVal = 21; W[chap][p] = w;
  // //* (sentence 0, word 2) ... 
}
load51() { 
  W[51] = (qword *) malloc(365*sizeof(qword)); 
  // Then fill every single qword in W[51], like in load50()
}

load50()效果很好,一切都符合预期,W[50]非常完美。

printf W[50][375].L显示load51()被调用后会被更改。请注意,W[51]qword小约10 W[50]

W是一个全局变量,因此我不需要将***qword传递给load函数并调用load(&W)

Cygwin(GCC)下的同样问题& Visual Studio。

解决方案

请勿使用有限范围Bmalloc代替

w.L = malloc(3); w.L[0] = 1; w.L[1] = 12; w.L[2] = 12;

1 个答案:

答案 0 :(得分:2)

在你的函数中考虑这个块:

{ char B[] = {1, 12, 12}; w.L = B; }

此处变量B在块 中是 local。块结束后(使用})变量超出范围并停止存在,留下一个迷路指针。

取消引用此迷路指针会导致未定义的行为

也许您应该动态为w.L分配内存,并将复制 B的内容分配到已分配的内存中(记住free内存时你释放了结构。)

在不相关的说明中,我建议您仅使用char作为实际字符。如果你想要小的有符号整数,我建议你改用int8_t。它只是unsigned char的别名,但它告诉读者您的代码只是存储小整数而不是字符。这种语义信息使程序在未来更容易维护。