在下面的代码中,行:
*end = *front;
给出了分段错误。我问了一个类似的问题here,但我不确定这是不是因为我有两份num。请解释为什么它是seg-faulting。谢谢。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* getPalin(char* num);
int main()
{
char* num = (char*)malloc(100);
num = "123456";
printf("%s\n", getPalin(num) );
return 0;
}
char* getPalin(char* num)
{
int length = strlen(num);
if ( length % 2 == 0 )
{
char* front = num;
char* end = num + strlen(num) - 1; //pointer to end
while( front != num + (length/2) ) //pointers not middle yet
{
*end = *front;
printf("%c", *end);
front++;
end--;
}
}
return num;
}
答案 0 :(得分:17)
这两行:
char* num = (char*)malloc(100);
num = "123456";
具有以下效果。
第一个分配100个字节并设置num
以指向那些字节。
第二个将num更改为指向字符串“123456”,这几乎肯定是在只读内存中。
任何更改只读内存内容的尝试都会导致分段违规。在尝试更改字符串之前,您需要将字符串复制到malloc
'd num
,其中包含:
strcpy (num, "123456");
这就是你现在所拥有的那条线:
num = "123456";
答案 1 :(得分:4)
使用
strncpy(num, "123456", 100);
而不是
num = "123456";
答案 2 :(得分:1)
根据康斯坦丁的回答。
您已经使用malloc语句为num分配了内存。
如果你没有,那么你就可以逃脱:
char* num = "123456";
哪些可以动态定义和分配内存,但它很可能被分配为常量,因此只读。
使用strncpy而不是strcpy复制“123456”将确保超出字符串null终止符末尾的任何额外空间也初始化为null,只要将n指定为100(对于您的示例)。否则,如果没有将malloc分配的内存初始化为null(memset(num,0,100)),那么可以想象你可以超越字符串的末尾。
哦差点忘了。建议使用strcpy_s或strncpy_s,因为它们更安全,但对于您的代码来说无关紧要。
答案 3 :(得分:0)
错误的原因是:
char* num = (char*)malloc(100);
在这一行中,你已经将num声明为指向数组的指针或指向第一个元素的指针而不是字符串。
num = "123456";
这一行你使用num作为字符串声明它。这违反了分段,因此违反了seg故障。您的代码的首选(正确)语法是:
char num[100];
strcpy(num,"123456"); //Even if you use num="123456"; here it would still be wrong
OR
char* num = (char*)malloc(100);
strcpy(num,"123456");
OR
char num[100]={'1','2','3','4','5','6'};
任何这些都可以帮助你。