【问题标题】:Working with char pointer -> Segmentation fault [duplicate]使用 char 指针 -> 分段错误 [重复]
【发布时间】:2019-07-08 23:15:32
【问题描述】:

我是一个初学者,在学校我们的任务是使用指针拆分一个 char 数组。我想拆分名称和生日(分隔符 = '.')。我的解决方案非常适合这个名字,但是在生日那天我得到了一个分段错误。

int main(int argc, char *argv[])
{
    char *fullname;
    char *name;
    char *lastname;
    char *birthday;
    char *day;
    fullname = argv[1];
    birthday = argv[2];
    int i = 0;
    int y = 0;
    int z = 0;

    while(fullname[i] != '.'){
        char x = fullname[i];
        name[i] = x;
        fullname[i] = ' ';
        i++;
    }
    i++;

    while(fullname[i] != '\0'){
        char x = fullname[i];
        lastname[y] = x;
        fullname[i] = ' ';
        i++;
        y++;
     }

    while(birthday[z] != '.'){
         char b = birthday[z];  
         day[z] = b;
         z++;
    }
}

命令行输入(./a是cygwin上的exe文件):

./a mister.gold 11.05.2005

输出:

segmentation fault

当我在没有最后一个循环的情况下启动代码时,我的输出是:

mister
gold

【问题讨论】:

  • namelastname 和好友未初始化为指向任何有效内存。
  • 你不能使用未初始化的char*指针。
  • @EugeneSh。感谢您的回复,但是为什么当我删除最后一个循环时它会起作用?
  • 它没有。这是未定义的行为
  • 您应该检查argc == 3,如果不是,例如,打印错误和return EXIT_FAILURE(在stdlib.h 中定义)或通常为非零。此外,您可以检查是否未遇到 '.''\0'。见stackoverflow.com/a/963777/2472827

标签: c pointers char segmentation-fault fault


【解决方案1】:
char *name ;
char *lastname;

两个 char 数组指针,但是它们指向什么?什么都没有,所以您基本上是在尝试访问您不拥有的内存 为他们分配内存,你应该这样做:

 // assuming the maximum size if 512 for example or you can give it any size you think is enough
 char *name =malloc(512);
 char *lastname=malloc(512);

现在它们指向您可以访问和修改的东西

在你使用完它们之后,你应该像这样释放动态分配的内存

free(lastname); 
free(name); 

【讨论】:

  • 非常感谢。它奏效了。
  • 您甚至可以通过将namelastname 分配给argv[1] 中的点来执行此操作,但需要将它们分配到可写的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 2018-10-19
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-23
相关资源
最近更新 更多