【问题标题】:I don't understand why a segmentation fault occurs in my C code [duplicate]我不明白为什么我的 C 代码中会出现分段错误 [重复]
【发布时间】:2017-09-08 15:29:35
【问题描述】:
#include <stdio.h>
#include <string.h>

int scomp(char* x, char* y);

int main(void)
{
    printf("gimme a string: ");
    char* str1;
    scanf("%s",str1);
    printf("gimme another string: ");
    char* str2;
    scanf("%s",str2);
    printf("comparing them......\n__________\n");
    if(scomp(str1,str2) == 0)
    {
        printf("yup, they are the same\n");
    }else if(scomp(str1,str2)== 1){
        printf("They are different buddy..\n");
    }
    return 0;
}

int scomp(char* x, char* y)
{
    int n=0;
    while(x[n] != '\0')
    {
        if(x[n] == y[n])
        {
            n++;
        }else{
            return 1;
        }
    }
    return 0;
}

它给了我分段错误 11,我在最后一部分中编写的应该比较字符串的函数一定有问题。 有什么问题?

【问题讨论】:

  • 你的 scanfs 的返回值是什么,根据规范是什么意思?
  • 您正在将数据读入未分配的内存(str1str2),这不是一个好主意。但是您的代码也存在逻辑问题,但这不会导致段错误。
  • str1 和 str2 指向什么?
  • 除了未分配的指针之外,比较字符串的函数应该被重写:while(x[n] != '\0') -> while(x[n] &amp;&amp; y[n])
  • @GiannandreaVicidomini 这不起作用,它只是看起来像它起作用。因为指针指向内存的随机部分(在您的情况下未初始化),所以使用 char * 会导致错误。但是如果你声明它char string;,它在堆栈上有一个位置和地址,并且表现得好像它可以工作,但是你可能会面临更进一步的未定义问题。

标签: c


【解决方案1】:
char* str1;
scanf("%s",str1);

char* str2;
scanf("%s",str2);

str1str2未初始化,由于它们是指针,因此您基本上是将 scanf 的结果写入内存中的随机位置。

这就是为什么你得到一个分段错误(你的程序试图在一个没有被授权写入的内存段上写)

【讨论】:

  • 也提供解决方案。
  • @tilz0R 我宁愿将此问题标记为重复。
  • 那就来吧:)
  • 你是在告诉我我应该 malloc 一些空间,对吧?坚果为什么这个工作没有给出同样的错误:char* string; scanf("%s",string); printf("%s",string);
  • 您的代码错误有几个原因。但这显然是我的第一个。你的强迫症犯了同样的错误。 小心初始化错误的指针。如果幸运的话,您的程序可能有时会起作用(就像您在评论中的示例一样)!这些错误是您在 C 中可能犯的最严重的错误之一,因为如果您不小心,可能很难调试。为了您自己的安全,请阅读一些关于 C 中的内存分配和字符串的基本书籍 :)。
猜你喜欢
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多