2015-12-22 64 views
2

我做了一个函数,加载行并将其保存到数组中,每当getline函数加载一个新行时,它就会进行dinamically分配,但是当我想要从数组中打印所有保存的行时,我的代码结束了。你能告诉我问题在哪里吗?当我删除功能,并把所有东西,它的工作正常。传递二维数组的字符作为参数

#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; 
} 

回答

4

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

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

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

main有了一些变化传递的array地址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); 
+0

所以,在我的代码我coppied阵列为什么它在致力于这就是功能我的功能和外部功能,它没有工作,给了我分段故障,因为我想打印数组,指出无处?不知道我是否理解正确。编辑代码compilator给我3错误。 – kvway

+0

差不多。 'main'中的'array'指向'NULL',它不会被'load'函数修改。解引用它将调用未定义的行为。 – haccks

+0

获取3个错误:slova.c:18:68:错误:无效转换从'void *'到'char **'[-fpermissive] * array = realloc(array,(* index + 1)* sizeof(char *)); ^ slova.c:19:63:错误:从'void *'无效转换为'char **'[-fpermissive] array [* index] = malloc((riadok + 1)* sizeof(char *) ); ^ slova.c:20:39:错误:无法将参数'1'转换为'char *'为'char * strcpy(char *,const char *)' strcpy(array [*索引],缓冲区); – kvway