2013-07-10 4 views
1

Эта программа работает отлично:таНос в функции - ошибка сегментации

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

#define MAX_NUM 2 

int tempfunction (char **comments) 
{ 
    char str1[]="First string\n"; 
    char str2[]="This is the second string\n"; 

    *(comments+0)=(char *) malloc(strlen(str1)+1); 
    *(comments+1)=(char *) malloc(strlen(str2)+1); 

    strcpy(*(comments+0), str1); 
    strcpy(*(comments+1), str2); 
    return 0; 
} 

int main(void) 
{ 
    char **comments; 

    /* This is the section I am talking about */ 
    comments=(char **) malloc(MAX_NUM*sizeof(char *)); 
    if (comments==NULL) 
    { 
     printf("\n### ERROR: malloc failed.\n"); 
     exit(EXIT_FAILURE); 
    } 
    /* Upto here............................. */ 

    tempfunction(comments); 
    printf("%s%s", comments[0], comments[1]); 
    return 0; 
} 

Но для удобства в дальнейшем я хотел бы положить раздел внутри tempfunctionmalloc. Когда я это делаю, я получаю ошибку ошибки сегментации.

Я думал, что это может быть из-за инициализации, поэтому вместо char **comments; я пишу:

char a = 'a'; 
char *P = &a; 
char **comments = &P; 

Но она по-прежнему не работает. Я был бы очень благодарен, если бы вы могли помочь мне понять, почему это происходит и как это исправить.

+4

[Не использовать введите возвращаемое значение 'malloc()'] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc/605858#605858)! –

+0

'char * comments [2] = {NULL, NULL};' будет делать. – wildplasser

+1

http://c-faq.com/malloc/mallocnocast.html – devnull

ответ

2

Try:

int tempfunction (char ***comments) 
{ 
    char str1[]="First string\n"; 
    char str2[]="This is the second string\n"; 

    *comments = malloc(MAX_NUM * sizeof(**comments)); /* you must check the return of malloc */ 

    (*comments)[0] = strdup(str1); 
    (*comments)[1] = strdup(str2); 

    return 0; 
} 

и вы называете это так:

tempfunction(&comments); 

Конечно, вы должны будете бесплатно в конце, чтобы избежать утечек памяти

+0

Спасибо большое, он работал правильно. Просто чтобы убедиться: для проверки вывода malloc я должен сделать «if (* comments == NULL)», правильно? – makhlaghi

+0

Да, то же самое, что вы делали в своей основной функции;) – Alexis

+0

Отлично. Благодаря.... ;). – makhlaghi

-2

Не пропускайте char ** комментарии от основной функции, Вместо этого вы можете объявить char ** комментарии внутри tempfunction, а затем вернуть ссылку комментариев на главную функцию. Это будет работать.

+0

Спасибо, но я не хочу ничего возвращать (кроме 0 или 1), потому что есть много других вещей, которые должна выполнять эта функция. – makhlaghi

0

Если вы хотите изменить функцию comments внутри функции, вам необходимо будет передать ее адрес, чтобы ее отражение было соответствующим образом. Поэтому вам необходимо пройти &comments т.е. char *** до tempfunction().

Я хотел бы предложить, чтобы обновить код, как:

int tempfunction (char ***ref_comments) 
{ 
    char str1[]="First string\n"; 
    char str2[]="This is the second string\n"; 

    char **comments = malloc(MAX_NUM*sizeof(char *)); 

    *(comments+0)=(char *) malloc(strlen(str1)+1); 
    *(comments+1)=(char *) malloc(strlen(str2)+1); 

    strcpy(*(comments+0), str1); 
    strcpy(*(comments+1), str2); 

    //now update the passed variable 
    *nef_comments = comments; 
    return 0; 
} 

int main(void) 
{ 
    char **comments; 

    /* This is the section I am talking about */ 
    comments=(char **) malloc(MAX_NUM*sizeof(char *)); 
    if (comments==NULL) 
    { 
     printf("\n### ERROR: malloc failed.\n"); 
     exit(EXIT_FAILURE); 
    } 
    /* Upto here............................. */ 

    // pass address of comments 
    tempfunction(&comments); 
    printf("%s%s", comments[0], comments[1]); 
    return 0; 
} 
+0

И вы создаете утечку памяти. –

+0

@Armin он хочет изменить его, выделив его. – Rohan

+0

Я хотел бы отрезать выделенный раздел и поместить его в tempfunction. Так что в следующий раз, когда я хочу эту функцию, мне просто нужно сделать одно определение. – makhlaghi

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