gpt4 book ai didi

无法访问第一个地址以外的 malloc 内存

转载 作者:行者123 更新时间:2023-12-04 12:32:10 25 4
gpt4 key购买 nike

读入一个文件,内存被动态分配给一个字符串,文件内容将被放置在这里。这是在函数内部完成的,字符串作为 char **str 传递。

使用 gdb 我发现在行 **(str+i) = fgetc(aFile);

处产生了段错误

这是 $ gdb a.out core 的输出以及一些变量的值:

Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x0000000000400bd3 in readFile (aFile=0x994010, str=0x7ffd8b1a9338) at src/morse.c:59
59 **(str + i) = fgetc(aFile);
(gdb) print i
$1 = 1
(gdb) print **(str + 0)
$2 = 65 'A'
(gdb) print *(str + 0)
$3 = 0x994250 "A"
(gdb) print (str + 0)
$4 = (char **) 0x7ffd8b1a9338
(gdb) print **(str + 1)
Cannot access memory at address 0x0
(gdb) print *(str + 1)
$5 = 0x0
(gdb) print (str + 1)
$6 = (char **) 0x7ffd8b1a9340

相关函数如下:

int readFile(FILE *aFile, char **str) // puts a file into a string
{
int fileSize = 0;
int i = 0;

// count the length of the file string
while(fgetc(aFile) != EOF)
fileSize++;

// malloc enough space for the string
*str = (char *)malloc(sizeof(char) * (fileSize + 1 + 1)); // one for null, one for extra space
if(!(*(str)))
printf("ERROR: *str == NULL\n");

// rewind() to the start of the file
rewind(aFile);

// put the file into a string
for(i = 0; i < fileSize; i++)
**(str + i) = fgetc(aFile);
**(str + i - 1) = '\0';

return 0;
}

为什么可以访问内存的开头(因为缺少更好的术语)而不是更多?**级看似连续的内存和*级不连续的内存有什么区别?

其余代码可见GitHub here .

最佳答案

应该是*(*str+i)而不是**(str+i)。您已将内存分配给 *str 指针。

关于无法访问第一个地址以外的 malloc 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29721864/

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