C-结构的元素在printf()调用后更改值

C-结构的元素在printf()调用后更改值,c,C,[请注意,我使用的是C] 我有一个问题,当我连续两次调用printf时,第二次得到“垃圾数据”。第一个printf将按预期打印出“rajan1”,第二个printf将打印出随机符号。我不确定是随机的还是地址。有人知道我为什么会收到这些结果吗? 下面是我的代码片段,它突出了我的问题(不是连续的printf语句: void main(void) { struct listNode **pStart = (struct listNode**) malloc(sizeof(struct list

[请注意,我使用的是C] 我有一个问题,当我连续两次调用printf时,第二次得到“垃圾数据”。第一个printf将按预期打印出“rajan1”,第二个printf将打印出随机符号。我不确定是随机的还是地址。有人知道我为什么会收到这些结果吗? 下面是我的代码片段,它突出了我的问题(不是连续的printf语句:

void main(void)
{
    struct listNode **pStart = (struct listNode**) malloc(sizeof(struct listNode**));
    load(pStart);
    printf(" %s\n",*(*pStart)->data->artist);
    printf(" %s\n",*(*pStart)->data->artist);
}
正如我所说的,第一次输出是我期望的字符串(它打印“rajan1”),第二次输出是随机的(通常是符号)。我在互联网上搜索了一个类似的问题,但没有找到。我的搜索表明我可能需要“释放”某个变量,但我不知道需要释放什么,或者它可能是我不确定的编译器版本所特有的(我使用的是visual studio 2012 ultimate v11.0.61219.00 update 5中默认的c编译器)。我已经包括了我所有的其他代码,因为希望有人能够复制它。我的主要问题是在什么情况下printf语句可以更改值

main.c

#include "Header.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void)
{
    struct listNode **pStart = (struct listNode**) malloc(sizeof(struct listNode**));
    load(pStart);
    printf(" %s\n",*(*pStart)->data->artist);
    printf(" %s\n",*(*pStart)->data->artist);
}
最后是我用来测试这一点的文本文件(songs.DATA):

edit1:在header.c的底部包含缺少的makeSongLength()

 while (fscanf(pF, "%100[^,],%100[^,],%100[^,],%100[^,],%2[^,],%2[^,],%5[^,],%2[^,]", &artist, &album, &song, &genre, &minutes, &seconds, &ntp, &rating) == 8)
此行将导致UB,因为在这些数组中,您没有为
空字符
留出空间。另外,读取
int
的格式说明符是
%d
。 换成这个-

while (fscanf(pF, " %99[^,],%99[^,],%99[^,],%99[^,],%d,%d,%d,%d,",artist, album,song,genre,&minutes, &seconds, &ntp, &rating) == 8)
void main(void)
->
int main(void)
int main(int argc,char**argv)


在几乎所有情况下,都不要对malloc的结果进行强制转换。

这是因为未定义的行为。您没有收到来自编译器的警告,告诉您有问题吗?
while(fscanf(pF),%100[^,],%100[^,],%100[^,],%2[^,],%5[^,],%2[^,”,&艺术家,&专辑,&歌曲,&流派,&分钟,&秒,&ntp,&评级)==8)
-->
while(fscanf(pF),%99[^,],%99[^,],%99[^,],%99[^,],%d,%d,,,艺术家,专辑,歌曲,流派,&分钟,&秒,&评级)==8)
。此外,您不会
释放分配的内存。如果您指向在函数调用后更改的对象,而这些对象不应该影响它们,这通常意味着您返回了指向某个堆栈分配值的指针,而不是堆分配值,但我没有仔细查看。您能将其简化为一个吗?这样做,您会发现ght解决您自己的问题,如果没有,那么如果您提供最少的信息来重现您的问题,其他人将更容易帮助您。
void main
是错误的。makeNode(makeRecord(艺术家、专辑、歌曲、流派、makeSongLength(分钟、秒)、ntp、评级)):->此makeSongLength(分钟、秒)在哪里@zstewart有很多
foo->bar=malloc(…);foo->bar=&local\u var;
@ameyCU我以前听人说过不要使用malloc,但除非我这样做,否则它不会编译。这只是visual studio的事情吗?@ameyCU使用
while(fscanf(pF),%99[^,],%99[^,],%99[^,],%d,%d,”,艺术家,专辑,歌曲,流派,&minutes,&ntp,&rating)==8)
。否则,
fscanf
在读取第二行时将在下一次迭代中失败,因为第一行中有尾随的
(请参阅
song.DATA
的内容)@CoolGuy它在data.Ohh-Yep中。@sparkstep当您不强制转换malloc的结果时,会出现什么错误?他应该使用c编译器
rajan1,summer india1,sweet summer1,pop1,21,31,01,11,
rajan2,summer india2,sweet summer2,pop2,22,32,02,12,
 while (fscanf(pF, "%100[^,],%100[^,],%100[^,],%100[^,],%2[^,],%2[^,],%5[^,],%2[^,]", &artist, &album, &song, &genre, &minutes, &seconds, &ntp, &rating) == 8)
while (fscanf(pF, " %99[^,],%99[^,],%99[^,],%99[^,],%d,%d,%d,%d,",artist, album,song,genre,&minutes, &seconds, &ntp, &rating) == 8)