C中的简单字符串运行时错误?

时间:2009-08-18 16:45:09

标签: c memory-management cstring

此代码编译正常,但在运行时会出现分段错误错误?有谁能说出原因?

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

int main() {
    const char s2[] = "asdfasdf";
    char* s1;

    strcpy(s1, s2);
    printf("%s", s1);

    return 0;
}

8 个答案:

答案 0 :(得分:13)

您为单个指针 s1分配了空间,但没有为s1指向的字节分配空间。

解决方案是为s1动态分配内存:

s1 = (char *)malloc(strlen(s2) + 1);
strcpy(s1, s2);

请记住,您需要再分配一个字节的内存(调用malloc时的+1)而不是s2中的字符数,因为存在隐式{{1}最后的字节。

有关详细信息,请参阅C Memory Management (Stack Overflow)

答案 1 :(得分:4)

您没有为s1分配内存。你有一个指向s1的指针,但没有为strcpy分配内存来将s2的值复制到。

char *s1 = malloc( strlen(s2) + 1 );

strcpy( s1, s2 );

答案 2 :(得分:3)

您尚未为s1分配任何内存。它是一个指向任何东西的指针。

char* s1 = malloc(sizeof(s2));
strcpy(s1, s2);
printf("%s", s1);
free(s1);

答案 3 :(得分:2)

问题是s1没有任何与之关联的内存。 strcpy不会致电malloc()

你可以这样做:

char s1[10];

char *s1 = malloc(10);

答案 4 :(得分:2)

他们都说了,你需要为s1分配空间。其他人发布的内容都可以正常工作,但是,如果您想要一种更简单的方法为现有字符串分配空间并将其复制到新指针中,那么请使用strdup,如下所示:

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

using namespace std;

int main() {
    const char s2[] = "asdfasdf";
    char* s1;

    s1 = strdup(s2);
    printf("%s", s1);

    return 0;
}

之前有人提到过strdup,这将是一种使用它的方法。大多数系统应该支持它,因为它在标准的C库中。但显然有些人没有。因此,如果它返回错误要么使用已经提到的方法编写自己的错误,要么只使用已经提到的方法;)

答案 5 :(得分:2)

还没有人指出strdup(String Duplicate)可能解决这个问题。

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

using namespace std;

int main() {
    const char s2[] = "asdfasdf";
    char* s1;

    s1 = strdup(s2);  // Allocates memory, must be freed later.
    printf("%s", s1);

    free(s1);         // Allocated in strdup, 2 lines above
    return 0;
}

答案 6 :(得分:1)

您需要分配目的地(using namespace std;不是C而是C ++,其余代码是C)。

答案 7 :(得分:0)

您必须为指针s1分配内存。如果你不这样做,它将指向一个未知的地方,从而达到分段错误。正确的代码应该是:

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

int main() {
    const char s2[] = "asdfasdf";
    char* s1 = malloc(21 * sizeof(s2[0]));
    strcpy(s1,s2);
    printf("%s",s1);
    return 0;
}