Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么一个简单的字符数组声明会破坏我的代码?_C_Arrays_Segmentation Fault - Fatal编程技术网

C 为什么一个简单的字符数组声明会破坏我的代码?

C 为什么一个简单的字符数组声明会破坏我的代码?,c,arrays,segmentation-fault,C,Arrays,Segmentation Fault,我一直在玩弄文件编写函数,以便更详细地研究它们的属性,以及其他一些事情(但是我所做的最终是不相关的),并且在我做这件事的过程中,我遇到了一个分段错误。但不仅仅是日常类型的segfault(取消对未分配空间或其他内容的引用),segfault在某种程度上是由字符数组的声明引起的。在代码字符名称[10]中。char name[10]的声明会导致分段错误,我不明白为什么。对该声明进行注释可消除该问题。这是怎么回事 我写的代码如下: #include <stdio.h> #include &

我一直在玩弄文件编写函数,以便更详细地研究它们的属性,以及其他一些事情(但是我所做的最终是不相关的),并且在我做这件事的过程中,我遇到了一个分段错误。但不仅仅是日常类型的segfault(取消对未分配空间或其他内容的引用),segfault在某种程度上是由字符数组的声明引起的。在代码字符名称[10]中。char name[10]的声明会导致分段错误,我不明白为什么。对该声明进行注释可消除该问题。这是怎么回事

我写的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

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

//char name[10];
//strcpy(name, "George");
//printf("%s\n", name);

//if(argc == 2){

//char *myname = "George";

    FILE *file = fopen("Readmystuff" , "rt");//fopen(argv[1],"rt");

    if(file == NULL)
        printf("Could not open file: %s\n", strerror(errno));

    char *str, *cr;
    int maxsize = 200;

    cr = fgets(str, maxsize, file); 

    int fcl = fclose(file); 

    printf("\n");   

    int strl = strlen(str);

    if(fcl == 0)
        printf("File closed succesfully\ncr: %c\nstr: %s\nTotal string size - 1 (for null): %i\n", *cr, str, strl);
    else
        printf("File did not close");
//}
//else
    //printf("There must be one argument, argv[1] = the filename, for the code to work\n");

return 0;
#包括
#包括
#包括
#包括
int main(int argc,char*argv[]){
//字符名[10];
//strcpy(姓名“乔治”);
//printf(“%s\n”,名称);
//如果(argc==2){
//char*myname=“乔治”;
FILE*FILE=fopen(“Readmystuff”,“rt”);//fopen(argv[1],“rt”);
if(file==NULL)
printf(“无法打开文件:%s\n”,strerror(errno));
char*str,*cr;
int maxsize=200;
cr=fgets(str、maxsize、file);
int fcl=fclose(文件);
printf(“\n”);
int strl=strlen(str);
如果(fcl==0)
printf(“文件已成功关闭\ncr:%c\nstr:%s\n总字符串大小-1(对于null):%i\n”、*cr、str、strl);
其他的
printf(“文件未关闭”);
//}
//否则
//printf(“必须有一个参数,argv[1]=文件名,代码才能工作\n”);
返回0;
}


您的
str
指针未初始化,其值不确定。您正在向无效对象写入数据。定义一个具有足够大小的数组,或者使用
malloc
来分配一个数组。

因此ouah提供了一个令人满意的答案。然而,我认为将他所说的翻译成代码可能也很有用,因为人们仍然熟悉c(像我一样)。问题是指针*str未初始化(并且没有指向任何地方)。修复方法只是分配一些内存并返回一个地址到该内存,以便初始化指针,即:指向某物

代码:

char *str; 
必须改为

char *str = (char *)malloc(sizeof(char)*whateveryouexpect);

这样做可以解决问题,并且可以毫无问题地声明字符数组char name[10]

如果你不明白,就这样想吧!你正试图为没有土地的人建造一个家!你的str没有被分配任何空间来存储可能流入的信息!在
if(file==NULL)
情况下,您实际上需要中止而不是携带ony,您应该检查
cr!=空
在做
*cr
或使用
str
之前。先读一本C语言书或者至少读一下所用函数的手册怎么样?@Olaf我不是C语言专家。为了我自己的辩护,我天真地相信fgets会初始化str。请原谅我的无知。是的,为str分配空间是有效的,谢谢。虽然我不明白为什么代码运行在没有分配空间且名称[10]数组没有注释的情况下。这和什么有什么关系?这是未定义的行为,任何事情都可能发生。这是糟糕的风格;更简单的是
charstr[maxsize]char*str=malloc(maxsize)会比那些废话更简单。最后你需要
免费(str)
,谢谢你提供的信息。这样可以节省一些重复的打字。
char *str = (char *)malloc(sizeof(char)*whateveryouexpect);