我有一个像这样的多个char数组的结构(并且它可以工作):
struct maytinh {
char tenmay[10];
char mamay[10];
char test[10];
float manhinh;
int gia;
};
但如果它像这样,
struct maytinh {
char tenmay[99];
char mamay[99];
char test[99];
float manhinh;
int gia;
};
当我编译和扫描数据时,它会中断。 此外,当我在结构中放入另一个数组时,它也会中断:
struct maytinh {
char tenmay[10];
char mamay[10];
char test[10];
char test2[10];
float manhinh;
int gia;
};
为什么呢? (我正在使用c-free 4.0进行编译)
这是scanf代码:
void main() {
int n,i;
printf("input :");
scanf("%d",&n);
struct maytinh a[n];
for (i=1;i<=n;i++) {
printf("May tinh so: %d\n",i);
printf("Nhap ten may :");
scanf("%s",a[i].tenmay);
printf("Nhap ma may :");
scanf("%s",a[i].mamay);
printf("Nhap test :");
scanf("%s",a[i].test);
printf("Nhap kich thuoc man hinh:");
scanf("%d",&a[i].gia);
};
}
此代码完全适用于第一个结构。 这是我对动态大小结构数组的修复,包含malloc()和typedef(仅适用于像我这样需要的人):
typedef struct maytinh {
char tenmay[99];
char mamay[99];
char test[99];
char test3[99];
float manhinh;
int gia;
};
void main(){
int n,i;
printf("input :");
scanf("%d",&n);
maytinh *a;
a=(maytinh*)malloc(n*sizeof(maytinh));
for (i=0;i<=n;i++) {
printf("May tinh so: %d\n",i);
printf("Nhap ten may :");
scanf("%s",a[i].tenmay);
printf("Nhap ma may :");
scanf("%s",a[i].mamay);
printf("Nhap test :");
scanf("%s",a[i].test);
printf("Nhap kich thuoc man hinh:");
scanf("%d",&a[i].gia);
};
}
答案 0 :(得分:2)
我的第一个猜测是它无法分配更大的结构,因为你在堆栈而不是malloc()上分配它们,尽管我必须看到更多的示例代码来确定。
编辑:看起来我的猜测是正确的。您正在使用C的非标准扩展,使用非常数来分配数组。我打赌如果你用适当的malloc
电话取代它,你的问题将得到解决。
答案 1 :(得分:1)
数组从C中的0
开始
for (i=1;i<=n;i++) ... a[i] ...
应该是
for (i=0;i<n;i++) ... a[i] ...
也许
printf("May tinh so: %d\n",i+1);
答案 2 :(得分:0)
除了ring0的答案之外,结构中阵列的大小或数量也无关紧要。您应该知道,即使您在数组中分配字符,它也不会阻止人们输入更长的字符串(即缓冲区溢出)。您应该始终设置scanf()格式的长度,以确保它不会溢出。这是通过在length-1
中添加%s
来完成的。
另外假设c-free 4.0支持动态数组,你需要使用malloc()
按照Reinderien的建议分配你的struct数组。
即,
void main() {
int n,i;
printf("input :");
scanf("%d",&n);
struct maytinh a[n]; /* change to a malloc() call if it doesn't support dynamic arrays */
for (i=0;i<n;i++) {
printf("May tinh so: %d\n",i);
printf("Nhap ten may :");
scanf("%9s",a[i].tenmay);
printf("Nhap ma may :");
scanf("%9s",a[i].mamay);
printf("Nhap test :");
scanf("%9s",a[i].test);
printf("Nhap kich thuoc man hinh:");
scanf("%d",&a[i].gia);
};
}
答案 3 :(得分:0)
我想你是在正确的地方问的 - stackoverflow
:D
尝试更改
struct maytinh a[n];
到
struct maytinh *a = (maytinh*) malloc(sizeof(maytinh) * n);
并插入#include "malloc.h"
。