【问题标题】:Unable to understand reason for segmenation fault while accessing a char string访问 char 字符串时无法理解分段错误的原因
【发布时间】:2013-11-22 02:39:00
【问题描述】:

运行以下代码后出现分段错误:

int main(){
    const char *string = "This is not reverse";
    char *reverse;
    char temp;
    int length, i = 0;
    length = strlen(string);
    strcpy(reverse, string);

    while(i < (length/2)){
       temp = *(reverse+i); // this is the reason for segmentation fault..but why? 
       i++;
    }

}

谁能解释一下原因

【问题讨论】:

  • 您告诉strcpystring 复制到reverse,但实际上从未为reverse 提供值。
  • reverse 没有指向任何东西。
  • 知道了,抱歉这个问题..这是我的错误..

标签: c segmentation-fault strcpy


【解决方案1】:

你需要为reverse分配空间。例如

char *reverse = malloc(strlen(string) + 1);

顺便说一句,其余代码似乎存在算法错误。我认为您想要做的是:

#include <string.h>
#include <malloc.h>

int main(){
  const char *string = "This is not reverse";
  int length = strlen(string);
  char *reverse = malloc(length + 1);

  int i = 0;
  while(i < length){
    *(reverse + i) = *(string + length - i - 1);
    i++;
  }

  printf("%s\n", reverse);
  return 0;
}

【讨论】:

  • 你说得对,我怎么会错过..reverse = malloc((strlen(string)+1)*sizeof(char));
  • 是的,你是对的,这不是 C++,所以 malloc 不是 new。你真的不需要sizeof(char),因为那总是1
  • 另外,如果你使用的是最新的 C 编译器,你可以这样做:char reverse[strlen(string)+1];
  • 感谢..如此耐心地回答这个问题..是的,我正在练习一些字符串算法,但自己卡在这里..是的,上面的代码不完整:)
【解决方案2】:

而不是strcpy(reverse, string);使用reverse = string,因为你不需要为反向分配空间,只需将反向指向字符串即reverse = string

【讨论】:

  • 如果我将它指向一个 const char 的地址,我将无法编辑它。这有意义吗?
  • @user2901020:您说得对,您必须将字符串文字复制到可以修改的数组中。
  • user2901020:有有效点,在这种情况下,您要么定义 const 指针,因为查看您的代码似乎您没有修改字符串。或者你必须复制字符串。如果您认为我很乐意删除我的答案,因为它可能会产生误导
  • 嗯..但是,你为什么要删除你的答案..很多人可能会这样想..即使我的问题也不是一个很棒的问题..这都是关于从正确或错误的事情……事实上,我们从错误的事情中学到了更多……干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 2018-11-07
  • 2020-11-15
  • 2013-07-19
  • 1970-01-01
相关资源
最近更新 更多