解决
为什么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。
请勿使用有限范围B
,malloc
代替
w.L = malloc(3); w.L[0] = 1; w.L[1] = 12; w.L[2] = 12;
答案 0 :(得分:2)
在你的函数中考虑这个块:
{ char B[] = {1, 12, 12}; w.L = B; }
此处变量B
在块 中是 local。块结束后(使用}
)变量超出范围并停止存在,留下一个迷路指针。
取消引用此迷路指针会导致未定义的行为。
也许您应该动态为w.L
分配内存,并将复制 B
的内容分配到已分配的内存中(记住free
内存时你释放了结构。)
在不相关的说明中,我建议您仅使用char
作为实际字符。如果你想要小的有符号整数,我建议你改用int8_t
。它只是unsigned char
的别名,但它告诉读者您的代码只是存储小整数而不是字符。这种语义信息使程序在未来更容易维护。