0

在编译并运行这个小程序来反转一个字符串时,我在任何输出发生之前得到一个分段错误。如果这是一个明显的问题,请原谅我,我对 C 还是很陌生。

#include <stdio.h>

int reverse(char string[], int length); 

int main() {
char string[] = "reversed";

  printf("String at start of main = %s", string);
  reverse(string, sizeof(string));
  printf("%s\n", string);

return 0;

}

// Reverse string 
int reverse(char string[], int length) {
 int i;
 char reversed[] = {};
 int temp;

 for(i = 0; i < length; ++i) {
 temp = string[i];
 reversed[length - i] = temp;

 }
 return 0; 
}
4

4 回答 4

6

因为这:

首先,您创建一个包含零元素的数组:

char reversed[] = {};

稍后您尝试写入该数组超出其范围:

reversed[length - i] = temp;

更新:

以上意味着您需要分配大小仅在运行时知道的内存(它是length)。通常的 C 风格的做法是......通过将内存分配的负担推给调用者:

int reverse(const char* string, char* destination, int length);

此函数将写入调用者提供的缓冲区,调用者现在还必须确保:

  1. 缓冲区足够大
  2. 缓冲区的内存在应该被释放时被释放
于 2010-05-13T20:34:21.770 回答
3

虽然它在这种情况下有效,但通常 sizeof(string) 应该是 `strlen(string)。通常,当使用 char 指针时,sizeof 运算符将只返回单个指针的大小 - 而不是整个数组。. 在 reverse() 中,您的反向数组未分配,您可以像这样分配它:

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

我们将长度加一以说明字符串末尾的空字符。

于 2010-05-13T20:38:25.960 回答
1

您的代码不能编译为 C。声明

char reversed[] = {};

是无效的。C 语言中没有空{}初始化器(它只存在于 C++ 中)。此外,空的初始化程序在未指定大小的数组声明中没有任何意义(这使得该代码也不能编译为 C++),因为在 C 和 C++ 中都没有零大小数组这样的东西。

发布真实代码,或者如果这应该是 C++,则重新标记您的问题。

于 2010-05-13T20:39:02.050 回答
0

在 C 语言中,您必须仔细考虑变量和数组占用的内存。

当您编写时,char reversed[] = {}您正在创建一个全新的零大小数组。(这显然不是严格正确的 C,但它提问者的 gcc 编译器发生的事情。毕竟,报告是运行时的分段错误,而不是编译时的语法错误。)

然后该语句reversed[length - i]尝试将数据写入您没有空间的数组元素,因为reversed没有大小。

你有两个选择:

  • 创建一个reversed适当大小的数组(也许malloc像@Bob Kaufman 所说的那样使用),然后从reverse()函数中返回它。
  • string通过在自身内部移动字符来“就地”反转字符串。

将字符串反转到位可能更可取——如果您动态分配内存,那么您必须担心再次释放它,这可能会很痛苦。

于 2010-05-13T20:41:09.150 回答