【问题标题】:Why segmentation fault为什么分段错误
【发布时间】:2013-11-01 19:19:40
【问题描述】:

以下代码块出现分段错误。请帮助。

 #include<stdio.h>
    int main(){
        int testcase,num;
        int i,j,*array;
        scanf("%d",&testcase);
        for(i=0;i<testcase;i++){
            scanf("%d",&num);
            for(j=0;j<num;j++){
                scanf("%d",(array+j));
            }
        }
        i=0;
        for(i=0;*(array+i)!='\0';i++){
            printf("%d",1);
        }
        }

【问题讨论】:

  • 因为scanf("%d",(array+j)); 调用未定义的行为array 是一个不确定的指针。最后的for循环同样无效。
  • 它的段错误在哪里,为什么你没有在调试器中单步执行?
  • 但是这个段没有给出分段错误
  • 它可以洗车、刷房子。它什么也做不了。 这是未定义行为。考虑一下:int a; 现在,a 的值是多少?你不知道吗?那是因为你不知道。这是不确定的。更糟糕的是,int a; int b=a;b 的值是多少?再说一次,你不知道。即使 评估 a 作为值也是未定义的行为。所以它也与代码中的指针一起使用。
  • @Johnsmith 那么也许你可以指出哪一行发生了段错误?

标签: c pointers


【解决方案1】:

编辑 2

想把这个放在上面。

我刚刚注意到您的代码有点奇怪。当您读取数字时,您会在i 上进行一个循环,然后在j 上进行另一个循环 - 每次迭代您只需覆盖您已经读取的值。这很奇怪,我不确定你的初衷是什么。所以虽然segmentation fault 仍然是由于未分配的数组引起的,但我在这里写的解决方案不是正确的(在我理解你的意思之前,我不确定什么是正确的解决方案)

Edit2 结束

array 未初始化。

它是一个指向内存中某个位置的指针,但那个位置不是空闲的,所以当你在那里写的时候,你会覆盖重要的东西并导致分段错误。

在您的情况下解决它的最佳方法是添加

array=malloc(sizeof(int)*testcase);

就在您阅读 testcase 的那一行之后,所以就在之后

scanf("%d",&testcase);

另外,如果你这样做了,最好在使用完内存后free 该内存。所以在你的情况下添加

free(array);

就在你打印完整个数组之后

编辑刚刚注意到您有另一个错误 - 在您打印数组的循环中:

for(i=0;*(array+i)!='\0';i++){

这很糟糕,因为您正在处理 array,它是一个整数数组,就像它是一个字符串一样。 “正常”数组不以 '\0' 结尾。此外 - '\0'char*(array+i)int

替换该行
for (i=0;i<testcase;i++){

【讨论】:

  • 别忘了释放你动态分配的内存。
  • 技术上'\0' 一个int(字符文字是ints),但是数组必须以0结尾的假设当然仍然存在无效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 2021-04-28
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 2021-07-19
相关资源
最近更新 更多