在另一个函数中访问字符串的分段错误
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;
}
这可能是菜鸟犯的错误,但我无法指出此分段错误的原因。下面是代码:
#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;
}