C中的分段错误。原因是什么?
我在C语言中遇到了分段错误,我不知道原因是什么。据我所知,当系统运行我们的内存时会出现分段故障。我检查了我的循环,它们似乎有明确的终止条件。因此,我不知道是什么导致我的代码崩溃。当我检查时,这个错误应该发生在mygetline或readlines函数中。 是否有任何调试器可用于查找程序崩溃的原因C中的分段错误。原因是什么?,c,C,我在C语言中遇到了分段错误,我不知道原因是什么。据我所知,当系统运行我们的内存时会出现分段故障。我检查了我的循环,它们似乎有明确的终止条件。因此,我不知道是什么导致我的代码崩溃。当我检查时,这个错误应该发生在mygetline或readlines函数中。 是否有任何调试器可用于查找程序崩溃的原因 #include <stdio.h> #include <string.h> #define MAXLINE 100 #define MAXLINENUM 10 int rea
#include <stdio.h>
#include <string.h>
#define MAXLINE 100
#define MAXLINENUM 10
int readlines(char *lines[]);
int mygetline(char line[]); /* getline: read a line into s, returns length */
void writelines(char *lines[], int nlines);
int main()
{
int i = 0;
char *lines[MAXLINE];
i = readlines(lines);
writelines(lines, i);
return 0;
}
int mygetline(char line[]){
int i, c;
for(i = 0; i < MAXLINE-1 && (c = getchar()) != '\n' && c != EOF; i++){
line[i] = c;
}
line[i] = '\0';
return i;
}
int readlines(char *lines[]){
int i, c;
i = 0;
while((c = mygetline(lines++)) > 0 && i < MAXLINENUM){ //line[i]
i++;
}
lines[--i] = '\0';
return i;
}
void writelines(char *lineptr[], int nlines) {
int i;
for (i = 0; i < nlines; i++)
printf("%s\n", lineptr[i]);
}
#包括
#包括
#定义MAXLINE 100
#定义MAXLINENUM 10
int readlines(字符*行[]);
int mygetline(字符行[]);/*getline:将一行读入s,返回长度*/
无效写线(字符*行[],整数行);
int main()
{
int i=0;
字符*行[MAXLINE];
i=读取行(行);
书写线(行,i);
返回0;
}
int mygetline(字符行[]){
int i,c;
对于(i=0;i0&&i
分段错误的原因是您没有为字符串分配任何存储空间。您可以在此处声明一个char*
数组:
char *lines[MAXLINE];
但是没有任何地方可以分配内存来保存实际的字符串
要继续使用以这种方式分配的char*
数组,您需要使用malloc
为实际字符串分配内存
lines[i] = malloc(...);
显然,您需要:
- 决定为每个字符串分配多少内存
- 调用
以在使用完内存后将其释放free
- 添加一些代码以检查您的写操作是否超出任何缓冲区的末尾
- 分段错误的原因是您没有为字符串分配任何存储空间。您可以在此处声明一个
char*
数组:
char *lines[MAXLINE];
但是没有任何地方可以分配内存来保存实际的字符串
要继续使用以这种方式分配的char*
数组,您需要使用malloc
为实际字符串分配内存
lines[i] = malloc(...);
显然,您需要:
- 决定为每个字符串分配多少内存
- 调用
以在使用完内存后将其释放free
- 添加一些代码以检查您的写操作是否超出任何缓冲区的末尾
main
为字符串指针分配内存,但不会初始化这些指针。您需要添加代码来设置这些指向有效内存块的指针,例如,通过malloc分配一些最大字符数:
while(i < MAXLINENUM) {
lines[i] = malloc(MAXLINE);
if (!mygetline(lines[i++])) {
break;
}
}
while(i
还要注意,在
行
的声明中将MAXLINE
与MAXLINENUM
混淆。出现segfault的原因是代码将数据读取到行中,而没有为读取的字符分配任何内存
您的main
为字符串指针分配内存,但不会初始化这些指针。您需要添加代码来设置这些指向有效内存块的指针,例如,通过malloc分配一些最大字符数:
while(i < MAXLINENUM) {
lines[i] = malloc(MAXLINE);
if (!mygetline(lines[i++])) {
break;
}
}
while(i
还请注意,在
行
的声明中将MAXLINE
与maxlineum
混淆,您创建了一个数组char*lines[MAXLINE]
,它是指针数组。但是,您尚未初始化这些指针,因此它们指向垃圾。然后将垃圾指针传递到mygetline
中,这就是问题所在
您不仅需要为要存储的行分配内存,还需要获取它可以读取的字符数。如果您为10个字符分配了空间,但用户输入了20个字符,您将遇到类似的问题。您创建了一个数组
char*lines[MAXLINE]
,这是一个指针数组。但是,您尚未初始化这些指针,因此它们指向垃圾。然后将垃圾指针传递到mygetline
中,这就是问题所在
您不仅需要为要存储的行分配内存,还需要获取它可以读取的字符数。如果为10个字符分配了空间,但用户输入了20个字符,则会出现类似问题。分段错误的原因是内存分配。 不能像
char*行[MAXLINE]那样分配内存代码>
请尝试以下代码
如果您使用的是1D阵列
char *lines;
lines=(char *)malloc(MAXLINE*sizeof(char));
如果您使用的是2D数组,请使用此代码
char **lines;
lines=(char **)malloc(MAXLINENUM*sizeof(char *));
for(i=0;i<MAXLINENUM;i++)
lines[i]=(char *)malloc(MAXLINE*sizeof(char));
char**行;
lines=(char**)malloc(MAXLINENUM*sizeof(char*);
对于(i=0;i分段错误的原因是内存分配。
不能像char*行[MAXLINE];
那样分配内存
请尝试以下代码
如果您使用的是1D阵列
char *lines;
lines=(char *)malloc(MAXLINE*sizeof(char));
如果您使用的是2D数组,请使用此代码
char **lines;
lines=(char **)malloc(MAXLINENUM*sizeof(char *));
for(i=0;i<MAXLINENUM;i++)
lines[i]=(char *)malloc(MAXLINE*sizeof(char));
char**行;
lines=(char**)malloc(MAXLINENUM*sizeof(char*);
对于(i=0;i)您当然可以使用调试器。为什么不这样做呢?您有一个指针数组。但是这些指针没有指向有效内存,而您正在读取它们。这就是问题所在。您的整个内存分配方案似乎都错了。您可以通过更改char*lines[MAXLINE]