我不知道为什么这段代码会让核心被转储?
I don't know why this codes make core dumped?
我想制作扫描单词的代码并使用指针数组打印它们,所以我制作了这段代码。但是当我实现它时,它会使核心被转储。为什么这段代码使核心转储以及如何修复它?我做代码有错吗?
那么请向我解释感谢您阅读我的问题。
#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()
(
- 如何找出GDB的SIGTRAP核心转储的根本原因
- C++映射分割错误(核心转储)
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 浮点异常(核心转储)#694457
- 分段错误(核心转储)但无法弄清楚
- 链接到libkcapi时没有核心转储
- 分段错误(核心转储) - 使用 SavedModel 的 Tensorflow C++ API 进行推断
- 在基数排序中,我得到 munmap_chunk():无效指针和中止(核心转储).为什么?
- C++指针无法在函数外部传递值和分段错误(核心转储)错误
- 合并排序:分段错误核心转储
- C++:分段错误(核心转储)
- 从 pybind11 构建导入模块时出现"分段错误(核心转储)"
- 如何使用 lldb 在曼扎罗中调试 lz4 文件格式的核心转储?
- qt C++命令行代码中的分段错误(核心转储)
- 从文件中读取的数据,但发生核心转储错误
- googletest:测试基类具有纯虚拟方法的派生类时的核心转储
- C++ atof - 分段错误(核心转储)
- Linux C 只禁止我的程序使用核心转储
- 为什么我的代码包含错误分段错误(核心转储)?