gpt4 book ai didi

c - C 中以字符串作为返回类型的函数错误 : cannot access at memory ''

转载 作者:行者123 更新时间:2023-11-30 20:57:25 25 4
gpt4 key购买 nike

我想编写一个函数,它给我一个字符串作为返回类型。使用此代码,我总是收到错误:“word”无法访问“0x63736e41”处的内存。

主要:

FILE *datei;
datei = fopen("C:\\Users\\user\\Documents\\dictionary.txt", "r");

char *word = getRandomWord(datei);

功能:

char* getRandomWord(FILE *datei)
{
int length = fsize("C:\\Users\\user\\Documents\\dictionary.txt"); //Get lenght of file
srand(time(NULL));
int randIndex = rand() % length+1; //Random number between 0 and the length of the file

char *cTest = malloc(20);

fseek(datei, randIndex, SEEK_SET); //I want to read only one random line from the file
fscanf(datei, "%s\0", &cTest);
fscanf(datei, "%s\0", &cTest);

return cTest;
}

最佳答案

您所显示的代码存在多个问题。

导致崩溃的最严重且可能的原因是,当您在 &cTest 中使用地址运算符 & 时,您将指针传递给了指针 .

请记住,scanf 格式%s 需要一个char * 类型的参数。当您执行 &cTest 时,您会得到一个 char ** 类型的值,这是非常错误的,会导致未定义的行为(并且可能会崩溃) .

简单的解决方案是按原样传递 cTest,因为它已经是正确的类型:

fscanf(datei, "%19s", cTest);
<小时/>

请注意,在我显示的对 fscanf 的调用中,我指定了 19 的字段宽度,因此 fscanf 函数不会读取太多并且写入超出了分配的内存范围。

我在格式字符串中也没有字符串终止符 \0,它不是必需的,fscanf 函数只会将其视为结尾格式字符串。

您确定要使用相同的 cTest 目标调用 fscanf 两次吗?第二次调用将覆盖第一次调用读取的内容(使您丢失第一次调用读取的字符串)。

您寻找文件中的随机位置。不能保证它会是一个单词的开头。甚至不能保证它会位于文件中的某个位置:您的计算可能会返回超出文件末尾一位的位置。

最后,讨论随机性:在任何现代的类似 PC 的系统上,time(NULL) 调用将返回一个整数,其中包含自纪元以来的秒数。这意味着,如果您在一秒钟内调用函数两次(或更多次),则每次调用都会设置相同的种子,从而使 rand() 返回完全相同的值。因此,对函数的每次调用都会导致它读取完全相同的数据。在程序开始时仅调用 srand 一次。

关于c - C 中以字符串作为返回类型的函数错误 : cannot access at memory '' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59809506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com