gpt4 book ai didi

c - 免费通话时段错误

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

char* meminfo()
{
char* buffer = NULL;
FILE* fp = fopen("/proc/meminfo", "r");
ssize_t read;

char* json = malloc(4096);
char* original = json;
json[0] = '\0';
json = strcat(json, "{");

size_t value = 1024;

while ( (read = getline(&buffer, &value, fp)) != -1)
{
char name[1024];
name[0] = '\0';

char val[1024];
val[0] = '\0';

sscanf(buffer, "%s:", name);
buffer = buffer + strlen(name);
name[strlen(name) - 1] = '\0';

sscanf(buffer, "%s kB", val);

json = strcat(json, "\"");
json = strcat(json, name);
json = strcat(json, "\": \"");
json = strcat(json, val);
json = strcat(json, "\", ");
}
int n = strlen(json);
json[n - 2] = '}';
json[n - 1] = '\0';

fclose(fp);
return original;
}

所以我有这个函数可以读取 meminfo 文件中的数据并生成一个 json 字符串对象。但是,如果我对该函数的返回值调用 free(),则会出现段错误,并且无法弄清楚(我在函数内分配变量并在之后释放它)。有什么想法吗?

最佳答案

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

buffer = buffer + strlen(name);

由于 buffer 指向的内存可能会在每次即将到来的迭代期间由 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. */
}
<小时/>

此外,代码还错过了系统调用的错误检查。

<小时/>

另一个问题是,如果 getline() 不返回任何内容,则此行会严重失败:

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. */

关于c - 免费通话时段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20536724/

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