我不知道为什么这段代码会让核心被转储?

I don't know why this codes make core dumped?

本文关键字:核心 转储 代码 为什么 段代码 我不知道      更新时间:2023-10-16

我想制作扫描单词的代码并使用指针数组打印它们,所以我制作了这段代码。但是当我实现它时,它会使核心被转储。为什么这段代码使核心转储以及如何修复它?我做代码有错吗?

那么请向我解释感谢您阅读我的问题。

#include <stdio.h>
#include <string.h>
int main(void)
{
char*pch[5];
int i;
for(i=0; i<5; i++)
{
printf("enter word: ");
scanf("%s", pch[i]);
}
for(i=0; i<5; i++)
{
printf("%sn", pch[i]);
}
return 0;
}

你不能只分配指针:

char*pch[5];

您需要为字符串分配内存:

char pch[5][100];

char*pch[5];定义了一个包含五个指向char的指针的数组。它不会为这些指针分配任何值,也不会为它们分配任何指向的空间。

scanf("%s", pch[i]);中,scanf必须传递一个指向已经分配的空间的指针。它不会分配空间,也不会改变pch[i]。因为没有给pch[i]赋值,所以没有定义此语句的行为。通常,scanf收到错误的地址,这会导致内存访问错误。

要解决此问题,您可以定义一个char数组数组:

char pch[5][256];

或者,您可以分配要用于每个指针的空间:

char *pch[5];
for (int i = 0; i < 5; ++i)
pch[i] = malloc(256);

这些中的任何一个都可以让你继续你的程序,但它们只适合早期学习目的。在继续编程时,您将学习如何限制scanf读取的内容,使其保持在为其提供的空间内,如何测试问题的malloc返回值,以及如何在输入可能溢出固定数量的空间时处理输入。

因为您没有为上面定义的 pch 指针数组分配空间。 关于斯特德普

在代码的每个部分之后查看我的评论。

char*pch[5];

pch是一个由 5 个字符指针组成的数组。 PCH 中的每个指针都指向某个garbage value

for(i=0; i<5; i++)
{
printf("enter word: ");
scanf("%s", pch[i]);
}

在这里,您正在尝试将输入字符串保存到无效地址(garbage address(。 此地址不是您的。 如果要保存输入字符串,请为其腾出空间。 怎么?malloc在堆上或堆栈上。我们如何在堆栈上分配?见下文:

假设您的字符串最多为 9 个字符,一个用于"\0",那么:

char*pch[5];
char str_0[10];
char str_1[10];
char str_2[10];
char str_3[10];
char str_4[10];
pch[0]=str_0; 
pch[1]=str_1; 
...... and so on ...

您可以在堆上分配整个字符串数组:

pch[0] = (char*)malloc(sizeof(char) * 10);
... and so on...

在malloc的情况下,您需要释放所有缓冲区(通过在末尾调用free()(