Bae:01000000000:Busy
Baek:01000000000:0222875074
Jung:022000000:Goodman
Kim:0102000000:
Han:010300000:ddd
////这是一些数据
#define MAX_LIST 1000
#define MAX_LINE 100
typedef struct
{
char name[20];
char phone[30];
char memo[40];
} Tel;
Tel arr[MAX_LIST];
static int count = 0;
////这是结构
void showList()
{
char line[MAX_LINE];
FILE *fp = fopen("data.txt", "r");
while (!feof(fp))
{
Tel element;
fgets(line, MAX_LINE, fp);
char *ptr = strtok(line, ":"); token --> ' : '
strcpy(element.name, ptr);
ptr = strtok(NULL, ":");
strcpy(element.phone, ptr);
ptr = strtok(NULL, "\n");
if (ptr == NULL) //When the next part is empty
{
ptr = " ";
}
strcpy(element.memo, ptr);
arr[count++] = element;
} **//Everything is saved in the arr[], but a segmentation fault occurs after that.**
fclose(fp);
for (int i = 0; i < count; i++)
{
printf("%d : %s %s %s\n", i, arr[i].name, arr[i].phone, arr[i].memo);
}
}
<块引用>
分段错误(核心转储)
///我想知道,为什么在ubuntu 18.04的while循环后会出现分段错误
我想进入下一个。
答案 0 :(得分:-1)
它的工作原理是不同的编译器以不同的方式运行。因此,虽然某段代码可能存在内存泄漏,但您在 vscode 上的编译器可能会忽略它。但是,在 Ubuntu 上可能并非如此。您可以使用 Valgrind 查找发生此内存泄漏的位置并解决此问题。另外,我想提一下,如果某些编译器显示内存泄漏,这主要意味着存在内存泄漏,最佳实践是即使您大部分时间都在使用 vscode 也能找到它。这是因为如果你不解决这个问题,当你的程序开发时,它会开始表现得很奇怪。在此处了解有关 valgrinf 的更多信息。
了解有关 Valgrind here 的更多信息。