我确实调试了程序,当我执行a[k]=a[h]时,分段错误确实出现在中。数组a是一个普通数组,所以我不明白问题出在哪里。。。你能帮我吗?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void Invert(char* a, int k, int h) {
if(k < h) {
char app;
app = a[k];
a[k] = a[h]; //here is the error
a[h] = app;
Invert(a,k+1,h-1);
}
}
void CallInvert(char* a, char k) {
int n = strlen(a);
Invert(a, k, n-1);
}
int main(int argc, char *argv[]) {
char *a; int k,i;
a = malloc(sizeof(char)*sizeof("Hi, how are you?"));
a = "Hi, how are you?";
k = 5;
if(k>=strlen(a)) {
printf("ERROR");
return 0;
}
printf("Before: "%s"n", a);
CallInvert(a,k);
printf("After: "%s"n",a);
free(a);
return 0;
}
在main()中,a = "Hi, how are you?"
是错误的。您在这里为一个常量字符串指定了一个指针。稍后,当您尝试写入常量字符串时,它将崩溃(正如iharob在下面指出的,写入常量字符串更具体地称为导致"未定义行为";这恰好是您平台中的分段错误)。
您需要使用strcpy
函数。类似:
a = malloc(sizeof(char)*sizeof("Hi, how are you?"));
strcpy(a ,"Hi, how are you?");
SEGFAULT是因为您无法更改常量文本的值。
查看我对内存分配代码的更改:
a = (char*)malloc(sizeof(char)* (sizeof("Hi, how are you?") + 1) );
strcpy(a,"Hi, how are you?");
sizeof("Hi, how are you?")
工作正常,但要存储' '
(字符串末尾),还需要一个字符。当然还有用于将字符复制到可修改存储器的strcpy
或strncpy
。
我尝试执行了几次,但在您上面提到的行中没有发现问题,现在我的代码看起来是这样的:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void Invert(char* a, int k, int h) {
if (k < h) {
char app;
app = a[k];
a[k] = a[h];
a[h] = app;
Invert(a, k + 1, h - 1);
}
}
void CallInvert(char* a, char k) {
int n = strlen(a);
Invert(a, k, n - 1);
}
int main(int argc, char *argv[]) {
char *a = NULL;
int k;
a = (char *)malloc(sizeof(char)*strlen("Hi, how are you?") + 1);
strcpy(a, "Hi, how are you?");
k = 5;
if (k >= strlen(a)) {
printf("ERROR");
return 0;
}
printf("Before: "%s"n", a);
CallInvert(a, k);
printf("After: "%s"n", a);
free(a);
return 0;
}
它似乎工作得很好,并产生了输出:
之前:";嗨,你好吗"
之后:";嗨,h?uoy时代的wo;
以下是我所做的一些更改:
- 使用
strlen
来获取字符串的长度,使用strcpy
来复制字符串,但我看到它有已经在评论中捕捉到了,为了清楚起见,我将把它留在这里 - 将malloc的返回值类型化为
char *
,就像Visual studio抛出错误。这实际上取决于你是什么平台继续运行
您的问题源于为指针分配字符串文字,该文字会覆盖malloc
返回的地址。这也意味着您对free
的调用将触发未定义的行为,例如segfault,因为您正在有效地执行以下操作:
char *a;
a = "Hi, how are you?";
free (a);
您也无法释放malloc
返回指针的内存。这意味着内存泄漏。
正如其他人所说,您希望使用strcpy
:复制字符串
a = malloc (sizeof "Hi, how are you?");
strcpy (a, "Hi, how are you?");
那么一切都会好起来的。
忽略那些不知道如何在这种情况下使用sizeof
的人。直到现在,他们可能还不知道字符串文字被认为是一个字符数组,加上一个额外的字符槽作为null终止符,而不仅仅是指向这样一个数组的指针。如果您愿意,可以使用strlen
并向其添加1,但当您嵌入了null字符时,这将失败,这与sizeof
运算符不同:
#define HELLO "Hello World!"
printf (
"%zun%zun",
sizeof HELLO,
strlen (HELLO) + 1
);
另外,我只是不喜欢在编译器可以在没有开销的情况下为我调用函数和执行算术。
然而,一旦将字符串文字分配给指针,就会删除任何大小信息,这可能是对sizeof
和字符串文字的误解的来源。在这种情况下,使用strlen
更安全。公平地说,我不知道有任何代码在用作sizeof
运算符操作数的字符串文本中实际嵌入了null字符。