2017-10-05 228 views
0

我试图使用strncpy,然后是strcpy,反之亦然,但我在运行时不断收到分段错误。我认为这是因为函数中存在逻辑错误,但我切换了他们的位置,只有第一个执行。调用strcpy时出现分段错误

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

int main(void) 
{ 
    char c = ' ', sentence[50], *pointer_to_string; 
    pointer_to_string = &sentence[0]; 
    int index = 0; 

    printf("Please enter a sentence:"); 
    while ((c = getchar()) != '\n') 
    { 
     sentence[index] = c; 
     index++; 
    } 
    sentence[index] = '\0'; 

    char *string_copy1, *string_copy2; 

    strncpy(string_copy1, pointer_to_string, 5); 
    printf("strncpy(string_copy1, pointer_to_string, 5):\n"); 
    printf("%s\n", string_copy1); 

    strcpy(string_copy2, pointer_to_string); 
    printf("strcpy(string_copy2, pointer_to_string):\n"); 
    printf("%s\n", string_copy2); 
} 
+0

尝试与'-g'标志和使用的valgrind编译而执行程序:'的valgrind/a.out' =>你会得到更多的信息 – YaatSuka

+1

'的char * string_copy1,* string_copy2;'没有。初始化这些变量之一。所以他们都没有指向有效的内存位置。然后你使用str(n)cpy来覆盖一个字符数组的内容 - 也就是一个“字符串” - 但是你给它的指针并不指向这样一个数组。因此,未定义的行为随之而来。 – rici

+1

在使用它们之前,您需要初始化'string_copy1'和'string_copy2;'。使用malloc了解如何在这里http://en.cppreference.com/w/c/memory/malloc –

回答

3

documentation参见:

char *strcpy(char *dest, const char *src); 

的第一个参数是一个指向目的缓冲区。但是你的指针没有初始化:

char *string_copy1, *string_copy2; 

因此,指针包含一些垃圾值。并strcpy()写入不属于您的程序的内存。它导致segmentation fault

char string_copy1[50] = { 0 }; 
char string_copy2[50] = { 0 }; 

用零填充它们时,只需要避免的问题strncpy()

如果第一n字节src之间没有空字节,放置在dest的字符串不能以null结尾。

+0

如何初始化它们? strncopy的第一个函数起作用。 – Gideon

+0

谢谢,我指出了新的字符数组的指针,并且这些函数起作用。 – Gideon

+1

请勿使用strncpy()。它并没有达到你所期望的程度,除了在数据库中设置固定宽度的字段(实际上它是用来设计的)之外,它实际上是无用的。 –