我正在尝试从网络上的教程中学习C,我想出了这个简单的代码来尝试理解指针和数组的内存分配。
如果size
< = 2,代码会编译并运行完美,但如果size
> 2它给出了分段错误。有人可以说明如何正确地做到这一点吗?
谢谢。
#include <stdio.h>
#include <stdlib.h>
int main () {
int i, size;
printf("Quantos registos pretende inserir? ");
scanf("%d",&size);
getc(stdin);
typedef struct {
char nome[81];
int idade;
char cargo[81];
} Dados;
Dados *data[(size-1)];
data[(size-1)] = (Dados *)malloc(sizeof(Dados));
for(i=0;i<size;i++) {
printf("\nInsira os dados do funcionário: ");
printf("\n\n\tNome: ");
gets(data[i]->nome);
printf("\n\tIdade: ");
scanf("%d",&data[i]->idade);
getc(stdin);
printf("\n\tCargo: ");
gets(data[i]->cargo);
FILE *fdados;
if(!(fdados = fopen("dados.txt","a+"))) {
printf("Impossivel aceder ao ficheiro, verfique o erro ocorrido ...");
}
fprintf(fdados, "Funcionário %d:",(i+1));
fprintf(fdados, "\n\n\tNome: %s",data[i]->nome);
fprintf(fdados, "\n\tIdade: %d",data[i]->idade);
fprintf(fdados, "\n\tCargo: %s\n\n",data[i]->cargo);
fclose(fdados);
}
free(data[(size-1)]);
fflush(stdin);
return(0);
}
答案 0 :(得分:2)
你一次又一次地给自己太多的事情。打破问题并测试每个组件:
解析用户输入:生成有效的size_t
整数或中止。检查该值是否既不为零也不是太大,或中止。
假设您已解析值n
。为结构的n
个副本分配内存:
Dados * data = malloc(n * sizeof(Dados));
最后,释放内存:
free(data);
使用正确的解析和错误处理来填充每个数组成员data[i]
。
单独练习文件操作。
答案 1 :(得分:1)
你有一个结构,似乎你想在一个数组中创建该结构的多个副本。所以你要做的就是这个
Dados *data;
data = (Dados *) malloc(sizeof(Dados) * size);
现在您拥有位于数据中的Dados结构的大小数量。
然后在最后确保释放你的记忆 自由(数据);
答案 2 :(得分:0)
删除:getc(stdin);
Dados *data[(size-1)];
data[(size-1)] = (Dados *)malloc(sizeof(Dados));// here is wrong .
you have data[size-1]
the max index you can use is size-2
for(i=0;i<size;i++) // i < size-1 , since you use data[i] in loop ,
free(data[(size-1)]); // free (data); just free the pointer you get.