传递二维char数组作为参数

时间:2015-12-22 19:20:42

标签: c arrays function allocation

我创建了一个加载线条并将其保存到数组的函数,每当getline函数加载一个新行时,它就会动态地复制,但当我想在代码末尾打印所有保存的行时,它会给我分段错误。你能告诉我问题出在哪里吗?当我删除该功能并将所有内容都放到main时它工作正常。

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

void load(char **array,int *index) {

        int riadok;
        size_t len = 0;
        char *buffer = NULL;

        printf("Slova:\n");
        while( ( riadok = getline(&buffer,&len,stdin) ) != -1 ) {

            if (riadok == 1){
                break;  
            }

            array = (char**) realloc ( array, ( *index + 1 ) * sizeof( char* ) );
            array[*index] = (char*) malloc ( (riadok + 1) * sizeof(char*) );
            strcpy( array[*index], buffer );

            *index = *index + 1;

      }

    }

int main()
{

   int index = 0;
   int i;
   char **array = NULL;

   load(array,&index);

   for (i = 0; i < index; i++ )
     printf("%s",array[i]);


   return 0;  
}

1 个答案:

答案 0 :(得分:4)

在C中,参数是按值传递的。当您将array中的main传递给该函数时,它只会复制到函数array中的参数load。声明

array = (char**) realloc ( array, ( *index + 1 ) * sizeof( char* ) );  

将指针array修改为新分配的内存。

array的地址从main传递给load功能

进行一些更改
void load(char ***array, int *index) { // Use pointer to pointer to pointer

    int riadok;
    size_t len = 0;
    char *buffer = NULL;

    printf("Slova:\n");
    while( ( riadok = getline(&buffer,&len,stdin) ) != -1 ) {
        //printf("%d\n", riadok);
        //printf("%s\n", buffer);
        if (riadok == 1){
            break;
        }


        *array = realloc ( *array, ( *index + 1 ) * sizeof( char* ) );
        if(*array == NULL)
            break;

        array[0][*index] = malloc(riadok + 1);
        if(array[0][*index])
            strcpy( array[0][*index], buffer );
        //else
        //  printf("Memory Not allocated\n");


        *index = *index + 1;
    }
    free(buffer);
}

并将其从main称为

load(&array,&index);