【问题标题】:segmentation fault when I set the a value to the end of a string当我将 a 值设置为字符串的末尾时出现分段错误
【发布时间】:2013-12-22 20:57:23
【问题描述】:

我写了一个反转字符串的简单函数。我尝试不使用 char* 末尾的最后一个字符 '\0' 为交换分配临时字符。但是,它会在 *end = *str; 处报告分段错误;

谁能解释原因?

非常感谢!

#include<stdio.h>
#include<stdlib.h>
void reverse(char* str)
{
    char* end = str;
    char* i = str;
    char* j = str;
    while(*end)
        ++end;
    j = end;
    *end = *str;
    while(j > i)
    {
        *i = *j;
        ++i;
        *j = *i;
        ++j;
    }
    while(i < end)
    {
        *i = *(i+1);
        ++i;
    }
    *i = '\0';
}

void main(int argc, char* argv[])
{
    char* str_test1;
    char* str_test2;
    str_test1 = (char*) malloc(10);
    str_test2 = (char*) malloc(2);
    str_test1 = "abcdefjhi";
    str_test2 = "a";
    printf("input str1=%s, str2=%s", str_test1, str_test2);
    reverse(str_test1);
    reverse(str_test2);
    printf("output str=%s, str2=%s", str_test1, str_test2);
    free(str_test1);
    free(str_test2);
}

[在我将代码更改为以下之后,它可以工作。]

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void reverse(char* str)
{
    char* end = str;
    char* i = str;
    char* j = str;
    while(*end)
        ++end;
    j = end;
    *end = *str;
    **--j;**
    while(j > i)
    {
        *i = *j;
        ++i;
        *j = *i;
        **--j;**
    }
    while(i < end)
    {
        *i = *(i+1);
        ++i;
    }
    *i = '\0';
}

void main(int argc, char* argv[])
{
    char* str_test1;
    char* str_test2;
    str_test1 = (char*) malloc(10);
    str_test2 = (char*) malloc(2);
    strcpy(str_test1, "abcdefjhi");
    strcpy(str_test2,"a");
    printf("input str1=%s, str2=%s\n", str_test1, str_test2);
    reverse(str_test1);
    reverse(str_test2);
    printf("output str=%s, str2=%s\n", str_test1, str_test2);
    free(str_test1);
    free(str_test2);
}

【问题讨论】:

  • 你正在做这一切,只是为了你没有临时变量?
  • 如果一个字符串比另一个长,你在哪里分配额外空间?
  • 大家好,我刚刚添加了我的 main 函数,我在其中调用了一个字符串的 reverse(char *) 函数。
  • str_test1 = "abcdefjhi"; str_test2 = "a"; 你这里有内存泄漏
  • @triclosan 你能解释一下吗?

标签: c


【解决方案1】:

这并不像你认为的那样:

str_test1 = (char*) malloc(10);
str_test2 = (char*) malloc(2);
str_test1 = "abcdefjhi";
str_test2 = "a";

你可能想要这个:

str_test1 = (char*) malloc(10);
str_test2 = (char*) malloc(2);
strcpy(str_test1, "abcdefjhi");
strcpy(str_test2, "a");

或者这个:

char str_test1[10] = "abcdefjhi";
char str_test[2]   = "a";

您当前拥有的分配内存,然后用指向只读字符串文字的指针覆盖指向您分配的内存的指针,这是获得段错误的好方法。

以上任何一种替换都会给你一个可写的字符串,你可以安全地反转它。

【讨论】:

  • 干得好。那时我不需要发布我的答案:)
  • @Joe Z,非常感谢您为我指出 strcpy 问题。但是,在我将 ++j 更改为 --j 后,我认为其余代码没有问题(我的错误:()。实际上,我使用保存 '\0' 的地方作为交换位置,那就是为什么我需要第二个循环移动反转字符串的右侧部分并将 '\0' 设置为 *end。
  • @MikeXu :我错过了你描述的第一句话中的那个细节。我将删除那部分答案。当我写下我的答案时,我意识到你想要做什么。
  • @JoeZ 非常感谢! :)
猜你喜欢
  • 2018-01-18
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
相关资源
最近更新 更多