c - 使用 getline() 动态分配的具有动态分配的字符串元素的数组

标签 c arrays memory-management

我正在尝试使用 getline() 创建一个动态分配的数组,其中包含动态分配的字符串元素。

这是我的代码,

char** getWordlist()
{
    FILE* fp = fopen( "Wordlist", "r" );
    if( errno == ENOENT )                   
        fp = fopen( "Wordlist", "w+r" );
    if( !fp ) {
        perror( "Could not open wordlist" );
    exit(EXIT_FAILURE);
}

int c, fileLines = 0;
do{
    c = fgetc(fp);
    if( c == '\n')
        fileLines++;
} while( c != EOF );
rewind(fp);


char** wordlist = calloc( fileLines, sizeof(char*) );  
for( c = 0; c < fileLines; c++ )
    getline( &wordlist[c], 0, fp );

     printf( "%s", (wordlist[0]) );

fclose(fp);
return wordlist;    
} 

但是,printf 打印输出 (null),所以我认为这些字符串从未创建过。

What am i doing wrong?

最佳答案

getline() 的错误使用

传递地址 size_t 而不是 0

for( c = 0; c < fileLines; c++ )
  // getline( &wordlist[c], 0, fp );
  size_t size = 0;
  getline( &wordlist[c], &size, fp );

在行数计算中将潜在的偏差修正为 1

int c;
size_t fileLines = 0;
int previous = '\n';
while ((c = fgetc(fp)) != EOF) {
    if( previous == '\n') fileLines++;
    previous = c;
}

关于c - 使用 getline() 动态分配的具有动态分配的字符串元素的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34138258/

相关文章:

无法让 C 方法 icalrecur_expand_recurrence 工作

java - 从数组中删除唯一值

c# - 连接对象的字符串表示的好方法?

c - 为什么 `alloca`不检查是否可以分配内存?

c - 为什么我的指针数组返回一个 unicode 字符?

c - 使用按位运算(非 float )缩放 4 位数字

python - OpenMP 和 Cython 缺乏加速和错误结果

c++ - 如何在 C 或 C++ 中构建大小为 n 的全新数据类型而不使用任何用户定义的数据类型?

ios - UIImagePickerController 和 fatal error : array element cannot be bridged to Objective-C

C++——不同类型对象的数组