繁体   English   中英

分段错误:核心被丢弃

[英]Segmentation Fault: Core Dumped

#include <stdio.h>

int main(){

   FILE *fp = ("Hello.txt","w");
   fprintf (fp, "\n Hello World");
   fclose(fp);
   return 0;
}

我在运行此程序时收到此消息

“分段错误(核心转储)”。

如果我知道为什么会发生这种情况以及如何解决它将会非常有帮助。 我目前正在使用
ubuntu中的代码块。 提前致谢 :)

是。 正如迈克尔沃尔兹评论的那样。 你错过了fopen

#include <stdio.h>

int main(){

   FILE *fp = fopen("Hello.txt","w");
   fprintf (fp, "\n Hello World");
   fclose(fp);
   return 0;
}

你错过了代码中的fopen。 另外,为避免其他问题,请务必检查fopen的返回值。 如果打开文件出错(例如空间不足,权限错误),它将为NULL

#include <stdio.h>

int main(int argc, char **argv)
{

    FILE *fp = fopen("Hello.txt", "w");

    if (fp==NULL)
        return -1;

    fprintf (fp, "\n Hello World");
    fclose(fp);

    return 0;
}

这条线:

FILE *fp = ("Hello.txt","w");

从意图的角度来看显然是错误的,因为你似乎错过了告诉编译器你要调用什么实际函数的步骤。 你几乎肯定想做的是:

FILE *fp = fopen("Hello.txt", "w");

任何体面的编译器都应该警告你这一点,例如使用gcc警告:

FILE *fp = ("Hello.txt","w");
           ^
warning: initialization from incompatible pointer type

我经常使用-Werror标志进行编译,以便让编译器将警告视为错误,以便准确捕获这类内容。


你可能真的想知道为什么编译器认为这只是一个警告,但事实是它是完全有效的代码。 表达式周围的括号是有效的,这就是为什么你可以写x = 7x = (7) ,甚至x = (((((7))))) ,并且它具有相同的意思。

剩下的只是括号的表达式,它使用C逗号运算符。 基本上,表达式a, b计算a (丢弃结果)然后计算b并将其用作表达式的结果。

您可以使用以下程序验证此行为,该程序输出w

#include <stdio.h>
int main (void) {
   char *fp = ("Hello.txt", "w");
   puts (fp);
   return 0;
}

你可能认为你对这种野兽的使用有限,但我保证你比你想象的更频繁地使用它,例如:

for (i = 0, j = 0; i < 100; i++, j += 2)
    printf ("%d x 2 = %d\n", i, j);

在这样的情况下,抛弃子表达式的结果是很好的,因为你只是依赖于评估的++副作用。


在您的情况下,声明:

FILE *fp = ("Hello.txt","w");

将评估"Hello.txt"并使用"w"分配给fp (因此不兼容的指针警告)。

然后,当您尝试使用 "w"的地址时,就好像它是一个有效的FILE指针一样,所有的赌注都是关闭的。


并且,作为旁注,您通常应检查所有可能失败的函数的返回值,如果此类失败可能在以后影响您的程序。 假设fopen (或malloc ,或许多其他函数)将始终有效是不明智的。 对于fopen ,这是确保返回值不为NULL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM