Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 免费呼叫时的Seg故障_C_Linux_Segmentation Fault_Free - Fatal编程技术网

C 免费呼叫时的Seg故障

C 免费呼叫时的Seg故障,c,linux,segmentation-fault,free,C,Linux,Segmentation Fault,Free,因此,我有一个函数,它读取并生成meminfo文件中数据的json字符串对象。但是,如果我对这个函数的返回值调用free(),我会得到一个seg错误,我无法找出它(我在函数中malloc变量,然后释放它)。有什么想法吗?您正在修改buffer指向连续调用getline()之间的位置 由于在每次迭代期间,buffer指向的内存可能会被getline()重新分配,因此在这两次迭代之间不能对其进行修改 要修复此问题,请进行如下所示的备份: buffer = buffer + strlen(name);

因此,我有一个函数,它读取并生成meminfo文件中数据的json字符串对象。但是,如果我对这个函数的返回值调用free(),我会得到一个seg错误,我无法找出它(我在函数中malloc变量,然后释放它)。有什么想法吗?

您正在修改
buffer
指向连续调用
getline()
之间的位置

由于在每次迭代期间,
buffer
指向的内存可能会被
getline()
重新分配,因此在这两次迭代之间不能对其进行修改

要修复此问题,请进行如下所示的备份:

buffer = buffer + strlen(name);

此外,该代码还会错过对系统调用的错误检查


另一个问题是,如果
getline()
不返回任何内容,那么这些行将失败:

char* meminfo()
{ 
    char * buffer = NULL;

    ...

    size_t value = 0;

    while ( (read = getline(&buffer, &value, fp)) != -1)
    {
      char * p = buffer; /* save the address, as buffer is modfied below. */

      ...

      buffer = p; /*restore address. */
    }

然后,char*json;在我的例子(CentOS 5.3,gcc 4.3)中,使用free()编写的代码工作得很好。没有赛格。过错无论如何为什么不使用memset()或bzero()初始化
json
?您可能溢出了4096缓冲区大小。您应该防御性地编程,并确保写入的内容不会超过缓冲区所能容纳的内容。@JimGarrison是的。我同意你的看法。动态分配(例如首先计算文件大小)更好。但是我认为4Kb对于
/proc/meminfo
来说已经足够了,使用不同的数组索引通常是一种危险的构造,应该避免。
char* meminfo()
{ 
    char * buffer = NULL;

    ...

    size_t value = 0;

    while ( (read = getline(&buffer, &value, fp)) != -1)
    {
      char * p = buffer; /* save the address, as buffer is modfied below. */

      ...

      buffer = p; /*restore address. */
    }
size_t n = strlen(json); 
/* json is "{" so its length would be 1 ... */

json[n - 2] = '}'; 
/* ... so here the code would address json[-1]. Which provokes undefinded behaviour. */