更改参数时数组更改

时间:2015-01-08 00:07:32

标签: c

所以我在c中有这个代码。一切正常,直到我再次读到单词。它得到了新单词但是(* A)[size-1]取了新单词的价格我怎么阻止这个?

void fuction(char ***A,char ***B,int size)
{
    char word[20],word2[20];
    printf("Type word .\n");
    gets(word);
    while(strcmp(word,"0")!=0)
    {
        printf("Type second word.\n");
        gets(word2);
        printf("%d",size);
        **A=realloc(**A,(size+1)*sizeof(char));
        **B=realloc(**B,(size+1)*sizeof(char));

        (*A)[size-1]=word;
        (*B)[size-1]=word2;

        size++;

        printf("Type another word to add or 0 to exit.\n");//**it all works fine** 
        gets(word);
    }
}

3 个答案:

答案 0 :(得分:2)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void function(char ***A, char ***B, int *size){
    char word[32], word2[32];

    printf("Type first word.\n");
    scanf("%31s", word);
    while(strcmp(word,"0")!=0){
        printf("Type second word.\n");
        scanf("%31s", word2);
        *A =realloc(*A, (*size+1)*sizeof(char*));
        *B =realloc(*B, (*size+1)*sizeof(char*));
        (*A)[*size]=strdup(word);
        (*B)[*size]=strdup(word2);

        ++*size;

        printf("Type another word to add or 0 to exit.\n");
        scanf("%31s", word);
    }
}

int main(void){
    int i, size = 0;
    char **w1, **w2;
    w1 = w2 = NULL;
    function(&w1, &w2, &size);
    for(i = 0; i < size; ++i){
        printf("%s, %s\n", w1[i], w2[i]);
        free(w1[i]);free(w2[i]);
    }
    free(w1);free(w2);
    return 0;
}

答案 1 :(得分:2)

原来问题是我没有为数组中的单词分配内存。我添加了这些行并且它工作。谢谢你的答案。

(*A)[size-1]=(char*) malloc(31); (*B)[size-1]=(char*) malloc(31);

答案 2 :(得分:0)

(*A)[size-1]=word;
(*B)[size-1]=word2;

不是你想象的那样。

在c中,这意味着如果您希望这样做,则将地址分配给数组word的第一个元素(*A)[size-1],前提是您已为(*A)[size-1]分配了内存你应该这样做

strcpy((*A)[size-1], word);
strcpy((*B)[size-1], word2);

您应该考虑为什么需要char ***,通常您不需要char **以上,并且不要使用gets()来代替fgets()。< / p>