我对C还不太熟悉,我设计了一个简单的实验来帮助我理解基本的I/O。
我正在创建一个程序,它将从一个basic.txt文件中读取数据,存储它,并允许我操作它。
在本例中,我使用的myanims.txt包含:

4 Dogs
3 Cats
7 Ducks

这是我的代码:
 #include <stdio.h>
 #include <stdlib.h>

 main()
 {
    char szInputBuffer[50]; //Buffer to place data in
    FILE *pfile;

    int i;
    char szAnimalName[20]; //Buffer to store the animal name string
    char *pszAnimalNames[3]; //An array of 4 pointers to point to the animal name strings
    int  iAmountOfAnimal[3]; //An array to store the amount of each animal


    pfile = fopen("MyAnimals.txt", "r");
    printf("According to MyAnimals.txt, there are:\n");

    for (i = 0; i <= 2; i++)
    {
        fgets(szInputBuffer, 50, pfile);
        sscanf(szInputBuffer, "%d %s", &iAmountOfAnimal[i], szAnimalName);
        pszAnimalNames[i] = szAnimalName;
        printf("%d %s\n", iAmountOfAnimal[i], pszAnimalNames[i]);
    }

    printf("The number of %s and %s is %d\n", pszAnimalNames[1], pszAnimalNames[2], iAmountOfAnimal[1] + iAmountOfAnimal[2]);
    printf("The number of %s and %s is %d\n", pszAnimalNames[0], pszAnimalNames[1], iAmountOfAnimal[0] + iAmountOfAnimal[1]);
}

但是我的输出是:
According to MyAnimals.txt, there are:
4 Dogs
3 Cats
7 Ducks
The number of Ducks and Ducks is 10
The number of Ducks and Ducks is 7

为什么pszAnimalNames[0、1和2]的值在程序结束时指向“Ducks”?
期望输出为:
According to MyAnimals.txt, there are:
4 Dogs
3 Cats
7 Ducks
The number of Cats and Ducks is 10
The number of Dogs and Cats is 7

最佳答案

char *pszAnimalNames[3];

不为文本分配任何内存。所以每次给它赋值时,实际上都指向szAnimalName,这是程序末尾的“鸭子”。
这一行:
pszAnimalNames[i] = szAnimalName;

实际上说pszAnimalNames[i]应该取szAnimalName所指的值。所以在循环的最后,pszAnimalNames中的每个值都指向同一个位置。即使您正在更改szAnimalName的内容,其位置仍保持不变。
那句台词应该是
pszAnimalNames[i] = (char *)malloc(sizeof(char)*20);
memcpy(pszAnimalNames[i], szAnimalName, 20);

它将为字符串分配空间并将其复制到名称列表中。然后在程序结束时,需要释放内存:
for (i = 0; i <= 2; i++) {
    free(pszAnimalNames[i]);
}

08-16 23:07