1

我正在尝试为一些示例部件设置结构数组,然后需要输出到文件。它似乎工作正常,但只会打印前 3 个部分,然后崩溃。

    #include "stdio.h"

main()
{
struct stock{
    char name[20];
    int partNum;
    int quantity;
};

struct stock someStock[3];

strcpy(someStock[0].name, "License plate");
someStock[0].partNum = 1234;
someStock[0].quantity= 4;

strcpy(someStock[1].name, "Head lamp");
someStock[1].partNum = 1111;
someStock[1].quantity= 2;

strcpy(someStock[2].name, "Rear wiper");
someStock[2].partNum = 2222;
someStock[2].quantity= 6;

strcpy(someStock[3].name, "Tyres");
someStock[3].partNum = 3333;
someStock[3].quantity= 10;

struct stock *ptr = &someStock[0];
int i;
FILE *file_ptr;
file_ptr = fopen("stock.dat", "w");

for(i=0;i<4;i++)
{
    fprintf(file_ptr, "%s %d %d\n",(*ptr).name,(*ptr).partNum, (*ptr).quantity);
    ptr++;
}

fclose(file_ptr);
return 0;

}
4

3 回答 3

4
struct stock someStock[3];

声明了一个 3 的数组struct stock,但您使用的是四个。括号中的数字是元素的数量,而不是最高有效索引。宣布

struct stock someStock[4];
于 2012-11-21T13:22:59.040 回答
1

正如其他人所说:

struct stock someStock[4];

其他一些提示:

struct stock *ptr = &someStock[0];

相当于:

struct stock *ptr = someStock;

正如 Daniel 指出的那样,这是因为数组名称在该上下文中计算为指向其第一个元素的指针。

和:

fprintf(file_ptr, "%s %d %d\n",(*ptr).name,(*ptr).partNum, (*ptr).quantity);

相当于:

fprintf(file_ptr, "%s %d %d\n", ptr->name, ptr->partNum, ptr->quantity);

->被称为结构指针运算符,它取消引用指针并访问一个成员,.这与结构成员运算符相反,因此当您有指针时也需要间接运算符。 *

于 2012-11-21T13:29:16.160 回答
0

结构股票 someStock[3]; 意味着您在数组中有三个元素,因此数组索引可以从 0 到 2 所以 strcpy(someStock[3].name, "Tyres"); 正在使您的程序崩溃,因为 3 超出范围数组索引

于 2012-11-21T13:24:26.797 回答