C中的指针和重新分配

时间:2014-09-30 22:05:17

标签: c arrays pointers realloc

我对C很新;在课堂上看了3个星期。我在使用指针时遇到了一些麻烦,我确信可能有一个简单的修复方法。所以基本上,这个程序应该从输入文件读取一个单词,将它存储在一个带有内存分配的指针数组中,打印单词和单词的规范化形式(无关过程),然后重新分配空间,以便指针数组将随着输入更多单词而增长。但是,我在打印单词和重新分配数组时遇到了一些麻烦(我目前将其设置为固定大小,只是为了解决整个打印方面的问题)。让我知道我的变量声明是否有问题,或者如果我只是犯了一个愚蠢的错误(我相信它可能是两者的组合)。再说一遍,我对C很新,所以如果这是一个简单的问题我会道歉。

char * word_regular[100];
char * word_norm[100];

int main (int argc, char * argv[])
{

    if (argc != 2){
        printf("You have not entered a valid number of files.\n");
        exit(1);
    }

    FILE * f_in = fopen(argv[1],"r");
    int i = 0;
    char word[512];
    char norm_word[512];

    while(fscanf(f_in, "%s", word) != EOF) {
        if (is_valid_entry(word)) {
            word_regular[i] = malloc(sizeof(char) * strlen(word) + 1);
            strcpy(word_regular[i],word);
            printf("%s\n",*word_regular[i]);
            word_norm[i] = malloc(sizeof(char) * strlen(norm_word) + 1);
            normalize(word, norm_word);
            strcpy(word_norm[i],norm_word);
            printf("%s\n", *word_norm[i]);
            i++;        

2 个答案:

答案 0 :(得分:1)

当前代码存在的一些问题(忽略动态大小需要而不是修复,因为你已经说过要用它来调试),

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

%s需要char *进行打印,因此它应该是

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

对于第二个printf,因为norm_word本身是一个char数组,

你应该只使用

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

如果要从第i个索引开始打印字符串。

<强>更新: 快速提示是要注意是否使用字符串复制\ 0。因为你的api调用,比如strlen会超出字符串崩溃(或者是最默默的),除非它被null终止。

答案 1 :(得分:0)

  1. printf来电的问题在于您传递char*word_regular[i]*norm_word[i])而不是char *({{1}尝试打印字符串时,},word_regular[i]

  2. 如果你想动态增长数组,你需要首先动态分配它,所以不要声明指针数组:

    word_norm[i]

    你需要声明指针指针:

    char * word_regular[100];
    char * word_norm[100];
    

    为它们分配一个初始缓冲区(在一个函数中,例如main):

    char ** word_regular;
    char ** word_norm;
    

    然后根据需要重新分配它们。

    word_regular = malloc(sizeof(char *) * INITIAL_AMOUNT);
    

    你需要跟踪数组中的指针数量,当然要正确释放它们......