gpt4 book ai didi

c - 由于 malloc 导致段错误

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

我目前正在尝试从 Linux 文件“/proc/net/dev”获取网络接口(interface)名称。我有两个问题。首先,我可以通过从第三行到文件末尾编写以下代码来获取它:

    char buffer[100], word[10];
fgets(buffer, 100, fp);
sscanf(buffer, "%s %*[:] %*s", word);

但问题是我得到带有冒号的字符串(lo: eth0: eth1:)。我怎样才能以我可以在屏幕上显示的方式获取它们。

第二个问题是为什么我在以下代码中遇到段错误:

#include <stdio.h>
#include <stdlib.h>

#define NETFILE "/proc/net/dev"

static char **interface_names;

int counting_lines()
{
FILE *fp = fopen(NETFILE, "r");
int i = 0;
char buffer[200];

while (fgets(buffer, sizeof(buffer), fp) != NULL)
{
i++;
}
fclose(fp);
return i;
}

void do_malloc()
{
int i;
int lines = counting_lines() - 2;

interface_names = (char **)malloc(lines * sizeof(char *));

for (i = 0; i < lines; i++)
{
interface_names[i] = (char *)malloc(10 * sizeof(char));
}
}

void free_malloc()
{
int i;

for (i = 0; i < (counting_lines() - 2); i++)
{
free(interface_names[i]);
}
free(interface_names);
}

void get_interface_names()
{
FILE *fp = fopen(NETFILE, "r");
int i = -2;
char buffer[100];

while (!feof(fp))
{
if (i < 0)
{
i++;
continue;
}
else
{
fgets(buffer, 100, fp);
sscanf(buffer, "%s %*[:] %*s", interface_names[i]);
i++;
}
}
fclose(fp);
}

int main()
{
do_malloc();
get_interface_names();
printf("%s\n", interface_names[0]);
printf("%d\n", counting_lines());
free_malloc();
return EXIT_SUCCESS;
}

最佳答案

您的sscanf模式是错误的。应该是:

        sscanf(buffer, " %9[^:] ", interface_names[i]);

开头的空格会跳过行开头的任何空格。然后,它解析直到下一个 : 的所有内容,并将其放入 interface_names[i] 中,最多允许 9 个字符(因为 interface_names[i] code> 为 10 个字节)。

关于c - 由于 malloc 导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43856396/

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