我创建了一个加载线条并将其保存到数组的函数,每当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;
}
答案 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);