首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C:使用fget()在动态缓冲区中存储字符串时调用realloc()之后的奇怪行为

C:使用fget()在动态缓冲区中存储字符串时调用realloc()之后的奇怪行为
EN

Stack Overflow用户
提问于 2013-10-31 20:23:50
回答 1查看 233关注 0票数 0

下面的代码加载一个名为gasses.txt的文本文件,该文本文件有16个术语,每个术语都位于自己的行中,并将这些术语一次存储在缓冲区search_terms中。

代码语言:javascript
复制
#define MAX_LINE_LEN 40
FILE *dict_fp;
int term_len;
int j;

size_t number_search_terms = 10;
int i;
char **search_terms = malloc(sizeof(char *) * number_search_terms);
for (i=0; i < number_search_terms; i++)
    search_terms[i] = malloc(MAX_LINE_LEN);

dict_fp = fopen("gasses.txt", "r");
for (i=0; fgets(search_terms[i], MAX_LINE_LEN, dict_fp) != NULL; i++){

    // get rid of the newline.
    term_len = strlen(search_terms[i]);
    search_terms[i][term_len-1] = 0;

    // resize buffer when it gets full
    if (i == number_search_terms-1){
        number_search_terms *= 2;
        search_terms = realloc(search_terms, number_search_terms);      
        for (j = number_search_terms/2; j < number_search_terms; j++)
            search_terms[j] = malloc(MAX_LINE_LEN);
    }

    printf("%s\n", search_terms[i]);

    printf("%s\n\n", search_terms[0]);

}

输出结果如下。在第一次内存重新分配之后,存储在search_terms中的字符串将被破坏。

代码语言:javascript
复制
nitrogen
nitrogen

oxygen
nitrogen

argon
nitrogen

carbon dioxide
nitrogen

neon
nitrogen

helium
nitrogen

methane
nitrogen

krypton
nitrogen

hydogen
nitrogen

nitrous oxide
���

xenon
���

ozone
���

nitrogen dioxide
���

iodine
���

ammonia
���

water vapour
���

这是gasses.txt:

代码语言:javascript
复制
oxygen
argon
carbon dioxide
neon
helium
methane
krypton
hydogen
nitrous oxide
xenon
ozone
nitrogen dioxide
iodine
ammonia
water vapour
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-31 20:28:06

当您第一次为search_terms使用malloc时,可以正确地使用sizeof(char *) * number_search_terms作为大小。

但是,当您使用realloc时,可以使用number_search_terms。这个新的大小是1/4或1/8,这是正确的大小(取决于您的指针大小),因此您最终会写到这个缓冲区的末尾。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19715963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档