在另一个函数中访问字符串的分段错误

Segmentation Fault accessing string in another function

这可能是菜鸟犯的错误,但我无法指出此分段错误的原因。下面是代码:

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

void revString(char *str){

    int n = strlen(str);
    char temp;

    for( int i = 0 ; i < n/2 ; i ++ ){
        // swap two chars. 

        temp = str[i];
        str[i] = str[n-i-1];
        str[n-i-1] = temp ; 
    }
}


int main()
{
    char *arr[2] = {"one","two"};
    printf("%s \n",arr[0]);  
    revString(arr[0]);
    printf("%s \n",arr[0]);
    return 0;
}

使用 GDB 跟踪错误后,它发生在步骤 str[i] = str[n-i-1]。这是因为访问 str[0] 并更新了它的值。 为什么是非法操作

需要考虑的事项:

  • 如果传入一个空指针,revString会做什么?
  • 如果str的长度是奇数怎么办?
  • strlen() 算什么,全长或 非空 个字符的“数量”?
  • 也许 str 的长度应该存储在一个 size_t 中,并给出一个更清晰的名称(比如 len?)
  • 正如 Kaylum 在评论中所暗示的那样,将指针作为函数参数传递具有不同的行为和规则。
  • 使用调试器,单步执行您的函数并检查它在做什么。

来自 C 标准(6.4.5 字符串文字)

7 It is unspecified whether these arrays are distinct provided their elements have the appropriate values. If the program attempts to modify such an array, the behavior is undefined.

因此将指针数组更改为字符串文字的第一个字符

char *arr[2] = {"one","two"};

二维字符数组,例如

char arr[2][4] = {"one","two"};

注意函数最好定义成

char * revString( char *str )
{
    for ( size_t i = 0, n = strlen( str ) ; i < n/2 ; i++ )
    {
        // swap two chars. 
        char temp = str[i];
        str[i] = str[n-i-1];
        str[n-i-1] = temp ; 
    }

    return str;
}