gpt4 book ai didi

c - 将文件读入动态数组时出现段错误 11 错误

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

我正在尝试读取一个可以为空或可以包含数字到动态数组中的文件。在读取文件中的所有数字后,我遇到段错误,或者文件为空,我不知道为什么,它正在这样做。

    //ptr and fp are passed from another function
ptr = malloc(10 * sizeof(int));
if (ptr == NULL){
printf("failed to allocate memory\n");
}
int sz = 10;
int counter = 0;
int fnum;
int *temp;
char lp1[MAXLINE];// maxline is 100
int i = 0;
while(fgets(lp1, MAXLINE, fp)!= NULL){
if(counter >= sz){
sz *=2;
temp = realloc(ptr,sz);
if (temp == NULL) {
printf("failed to allocate memory\n");
}
if (temp != NULL){
ptr = temp;
//free(temp);
}
}
int len = strlen(lp1);
if (len > 0 && lp1[len-1] == '\n'){
lp1[len-1] = 0;
}
fnum = strToInt(lp1);// number from file
printf("%i value of lp1 \n", fnum);
ptr[i] = fnum;
i++;
counter++;
}
return sz;

最佳答案

您的第一个 realloc 调用会将分配的内存从(可能)40 字节缩小到 20 字节。提供的大小以字节为单位,而不是“元素”的数量。您还需要在此处乘以基本“元素”大小。

<小时/>

此外,如果 ptr 作为参数传递,那么您按引用传递就是错误的。首先,C 没有按引用传递,只有按值传递,这意味着您的函数会获取作为参数传递的变量的当前值的副本。这个副本存储在局部变量 ptr中,与所有其他局部变量一样,一旦函数返回,它就会超出范围,并且所有对它的更改将会丢失。

要解决此问题,您需要通过将指针传递给变量来模拟按值传递,例如

// Code calling your function
...
int *ptr;
you_function(..., &ptr, ...); // Use address-of operator to pass pointer to variable
...

// Your function
int your_function(..., int **pptr, ...)
{
...
*pptr = malloc(...); // Use dereference operator to access what pptr points to
...
// Use parenthesis because array indexing have higher precedence than dereference
(*pptr)[counter++] = (int) strtol(lp1, NULL, 10);
...
}

关于c - 将文件读入动态数组时出现段错误 11 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37106365/

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