2016-07-16 3 views
-3

У меня есть функция, которая получает указатель массива char в качестве аргумента (char ** messageErreur). Этот указатель создается в основном, но память не выделяется, поскольку она создается только при необходимости (сообщение об ошибке для отображения) (здесь нет выбора, метод исходит из неизменяемого файла .h).Не удается прочитать строку, созданную malloc

вот код, где я получаю ошибку сегментации:

imageMsgErr (messageErreur, "error message"); 
printf("erreur1 P2\n"); 
printf("message erreur %s\n", *messageErreur); //**where i get the seg fault 


void imageMsgErr (char** messageErreur, char* msg){ 

    messageErreur= (char**)malloc(sizeof(char*)); 
    messageErreur[0]= (char*)malloc(sizeof (char) * 100); 

    if (*messageErreur){ 
     printf("before strcpy\n"); 
     strcpy(*messageErreur, msg); 
     printf("message erreur %s\n", *messageErreur); 
    } 
    return; 

Я попробовал несколько похожий код с тем же результатом: ошибка сегментации, когда он выполнит строку:

printf("message erreur %s\n", *messageErreur); 
+0

Почему вы произнесения возвращаемые значения из 'malloc'? –

+0

Скомпилируйте свой код с помощью флага '-g', запустите' valgrind' в своей программе с опцией '--leak-check = full' и включите его вывод в свой вопрос. –

+0

Вы, вероятно, должны это прочитать: http://stackoverflow.com/questions/2838038/c-programming-malloc-inside-another-function/2838207#2838207 – jamesdlin

ответ

0

Линия

messageErreur= (char**)malloc(sizeof(char*)); 

меняется, где messageErreur указывает местонахождение, только в порядке фикция. Он не изменяется, где указывает соответствующая переменная в вызывающей функции.

Один простой способ исправить это - слегка изменить функцию.

char** imageMsgErr (char* msg) 
{ 
    char** messageErreur = malloc(sizeof(char*)); 
    messageErreur[0]= malloc(sizeof (char) * 100); 

    if (*messageErreur){ 
     printf("before strcpy\n"); 
     strcpy(*messageErreur, msg); 
     printf("message erreur %s\n", *messageErreur); 
    } 
    return messageErreur; 
} 

и изменить вызов:

messageErreur = imageMsgErr("error message"); 

PS

См Do I cast the result of malloc?

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