我知道我的标题不清楚,使用代码+示例会更清晰。我想初始化一个 char*(主函数中的"motSecret",我的函数中的"mot"),其中包含随机选择到文件中的单词,并将其执行到函数中。此数组使用内存分配进行动态处理。我的函数中的变量初始化得很好,但是当我在退出函数后打印值时,值会发生变化并变成"0@"
以下是主要关注的部分:
int main()
{
FILE* dico =NULL;
char *motSecret, *motRes;
char lettre=' ';
int check=0, nbCoups=10, longueur=0, nbMots=0;
Bool erreur = TRUE;
srand(time(NULL));
nbMots = scanDico(dico);
getWord(dico, nbMots, motSecret);
printf("Mot : %s", motSecret);
问题出现在函数 getWord() 之后。这是这个函数的代码:
void getWord(FILE* dico, int nbLignes, char *mot)
{
int numMotChoisi=rand() % nbLignes, nbChar=0;
char charActuel=' ';
dico = fopen("dico.txt", "r");
rewind(dico);
if(dico != NULL)
{
while (numMotChoisi > 0)
{
charActuel = fgetc(dico);
if (charActuel == 'n')
numMotChoisi--;
}
charActuel = ' ';
while(charActuel != 'n')
{
charActuel = fgetc(dico);
nbChar++;
}
fseek(dico,-(nbChar)-1,SEEK_CUR);
mot = malloc(nbChar * sizeof(char));
if(mot == NULL)
{
printf("Probleme d'allocation memoire");
exit(0);
}
fgets(mot, SIZE, dico);
mot[strlen(mot) - 1] = ' ';
printf("Mot = %s ", mot);
}
fclose(dico);
}
函数末尾的 printf 返回一个很好的值,而主函数中 getWord() 之后的 printf 表明函数中更改的值尚未"保存"......
其他事情,无需内存分配即可正常工作。
我希望我足够清楚。如果我忘了说些什么,或者你需要更多信息,请告诉我。
C 在函数参数传递中使用pass by value
。
你需要一个双指针,如果你想在另一个函数中分配内存,就像void getWord(FILE* dico, int nbLignes, char **mot)
一样。
作为级联效应,printf("Mot : %s", motSecret);
正在尝试访问未初始化的内存,从而导致未定义的行为。
建议:
-
我认为没有理由在
getWord()
中使用FILE *dico
作为参数.在很可能是当地人。 -
与其使用双指针,我建议从
getWord()
返回分配的指针,即将void getWord()
更改为char * getWord()
,添加return mot
并像motSecret = getWord(<params>)
一样使用
char *motSecret;
motSecret
是main()
的局部变量,它不是启动的。
通过调用
getWord(dico, nbMots, motSecret);
您正在将一些未初始化的指针传递给函数getword()
。
在getword()
内部,您正在为分配一些内存
char *mot;
并将一些数据写入此内存。
现在不知道这个内存motSecret
您必须将此内存地址返回到未初始化的指针 main()
char *motSecret = getWord(dico, nbMots);
你的getword()应该是这样的,
char *getWord(dico, nbMots);
在执行所有操作之后,在此内部,
return mot;