1

我正在尝试在 C 中执行几个简单的 string_reverse 实现。但是,当我在 gdb 中调试时出现以下错误:

Program received signal SIGSEGV, Segmentation fault.
0x00000000004005ca in string_reverse1 (string=0x68 <Address 0x68 out of bounds>)
28          length = strlen(*string);
Missing separate debuginfos, use: debuginfo-install glibc-2.15-58.fc17.x86_64

这是我遇到的错误的代码(我评论了错误的来源):

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

int main(int argc, char *argv[])
{
    char *char1 = "hello";
    char *char2 = "hi";
    char *char3 = "this is a really long string!";

    string_reverse1(*char1);
    string_reverse1(*char2);
    string_reverse1(*char3);
    printf("%s, %s, %s\n", char1, char2, char3);

    return 0;
}

//Assuming method's purpose is to reverse the passed string
//and set the original string equal to the reversed one
void string_reverse1(char *string) 
{
    //Calculate length once so it isn't recalculated at
    //every iteration of the for loop
    int length;
    char *reversed;
    int i;
    int reversed_counter;
    length = strlen(*string); //ERROR
    reversed_counter = 0;
    for(i = length - 1; i >= 0; i--) {
        reversed[reversed_counter] = string[i];
        reversed_counter++;
    }
    //Can't forget to add the terminating null character!
    reversed[length] = '\0';
    string = reversed;
}

我知道 strlen 通过推进字符串返回传递字符串的长度,直到它到达 \0,即空字节。所以我想知道传递的字符串是否以某种方式不是以空值结尾的?我不认为我在 main 中错误地声明了字符串。

感谢您的任何见解。

4

3 回答 3

1

问题是当你打电话时string_reverse1

string_reverse1(*char1);

*beforechar1取消引用char1返回字符串的第一个字符的值。如果你想通过,*char你应该省略*. 这是因为 的类型char1已经是char *。没有必要改变它。

当您取消引用时,char1您将发送第一个字符“h”的实际 ascii 值。然后strlen尝试访问地址“h”处的内存并进行段错误,因为那只是一些任意的内存位置。

于 2013-01-28T03:02:34.493 回答
0

代替...

string_reverse1(*char1);

...做这个:

string_reverse1(char1);

您的字符串定义已经是指针,所以这就是您需要传入的内容。取消引用它们会给出一个根本不是内存地址的值。

于 2013-01-28T03:04:22.260 回答
0

根据您的声明 void string_reverse1(char *string),

  length = strlen(*string); //ERROR

应该改为

   length = strlen(string); 

主程序应将该函数调用为

string_reverse1(char1);
string_reverse1(char2);
string_reverse1(char3);

然后出现错误

反转[reversed_counter] = string[i];

因为您没有为您的字符分配空间(分段错误通常是由于访问未分配的内存造成的。

解决此问题的一种方法是使用

char* reversed = (char*) malloc(sizeof(char)*(length+1));

您仍然会遇到此代码的问题,因为

string = reversed;

实际上并没有改变“字符串”的内容。你可以改变函数的工作方式来解决这个问题。更好的方法是更改​​“字符串”本身中的字符,而不是使用另一个数组。

于 2013-01-28T03:28:51.823 回答