2015-11-30 4 views
-2
#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 

int main() { 
    int size_to_alloc = sizeof(char*) * 1; 
    char** p = (char**) malloc(size_to_alloc); 
    p[0] = (char*) malloc (sizeof(char) * 10); 
    strcpy("hello", p[0]); 
    printf("%s\n", p[0]); 
} 

Я, очевидно, пропущу что-то очень основное, но не могу понять, что.Почему этот простой кусок кода C дает ошибку сегментации?

+8

зЬгсра имеет аргументы в неправильном порядке. – keithmo

+1

[Пожалуйста, просмотрите эту дискуссию о том, почему бы не использовать возвращаемое значение 'malloc()' и family в 'C'.] (Http://stackoverflow.com/q/605845/2173917). –

+0

Спасибо за ответы. Отметив первый ответ Дилиппа как принятый. –

ответ

0

strcpy принимает свои аргументы в обратном порядке: пункт назначения сначала, второй источник. Попытка:

strcpy(p[0], "hello"); 
0

Просто сделайте небольшое изменение в strcpy функции: char *strcpy(char *dest, const char *src).

Dest: массив назначения
SRC: строка для копирования.

Как:

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

int main() { 
    int size_to_alloc = sizeof(char*) * 1; 
    char** p = (char**) malloc(size_to_alloc); 
    p[0] = (char*) malloc (sizeof(char) * 10); 
    strcpy(p[0],"Hello");  /* change */ 
    printf("%s\n", p[0]); 
} 

Выход: Здравствуйте

0

Пожалуйста, прочитайте man page из strcpy(). Это говорит

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

Таким образом, вы должны иметь первый аргумент как назначения (ака, копию), второй один, как источник (ака копия с).

В вашем случае "hello" был поставлен как копию адрес и "hello" быть строковая, попыткой скопировать что-нибудь в него (то есть, модификации строкового литерала) приведет к undefined behavior, что приводит к ошибка сегментации.

Решение: обмен аргументами вызова функции.

1

strcpy() функция есть аргумент несоответствие.

использование строки копии в соответствии с man pagechar *strcpy(char *dest, const char *src);

Таким образом, ваш strcpy() вызова должно быть strcpy(p[0], "hello");

Смежные вопросы