我无法使用箭头操作符打印结构成员的动态分配内存中的数据,但我可以使用相同的箭头操作符将数据放入其中
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int RollNo;
char Name[15];
int Class;
int Marks;
int Comments[100];
} details;
int main()
{
int n, i, j;
printf("Enter number of students\n");
if (scanf("%d", &n) != 1) {
perror("Invalid Input");
return 1;
}
details *memptr = malloc(n * sizeof(details));
if (memptr == NULL) {
perror("Memory not allocated successfully!!\n");
return 1;
}
for (i = 0; i < n; i++, memptr++) {
printf("Enter RollNo: ");
scanf("%d%*c", &(memptr->RollNo));
printf("Enter Name: ");
fgets(memptr->Name, 15, stdin);
printf("Enter Class: " );
scanf("%d%*c", &(memptr->Class));
printf("Enter Marks: ");
scanf("%d%*c", &(memptr->Marks));
printf("Enter Comments: ");
fgets(memptr->Comments, 100, stdin);
printf("\n");
}
printf("Student details\n\n");
for (j = 0; j < n; j++, memptr++) {
printf("RollNo: %d ", memptr->RollNo);
printf("Name: %s ", memptr->Name);
printf("Class: %d ", memptr->Class);
printf("Marks %d ", memptr->Marks);
printf("Comments: %s\n", memptr->Comments);
}
return 0;
}
为什么我不能用箭头操作符读取动态分配内存中的内容,但我可以用箭头操作符将数据放入其中?
3条答案
按热度按时间lzfw57am1#
您正在将指针移动到无效的地址。
在调试器中执行程序,并在单步执行代码时观察指针,应该会立即发现这一点。
修改
*alloc
函数返回的指针从来都不是一个好主意。使用您的计数器作为索引:
您也可以将
memptr
复制到临时变量并递增该变量。在第一次循环后,必须将该变量重置为初始值memptr
。顺便说一句:你也不应该混合使用
scanf
和fgets
,因为这可能会混淆缓冲。bakd9h0s2#
你增加了指向已分配块的指针,因此你失去了原始值,第二个循环继续增加这个指针,超过已分配数组的末尾。
您应该使用
memptr[i].xxx
而不是memptr->xxx
,并且不再递增指针,或者您应该使用单独的变量作为指针。还请注意,
fgets(memptr->Name, 15, stdin);
将在Name
数组中存储尾随的换行符,前提是名称短于14个字符,并且如果输入了更长的行,则会在输入流中留下额外的字符。以下是修改后的版本:
fivyi3re3#
你可以分配内存,但不能释放内存。
以下是我的回答:
运行它将输出:
以下是我的另一个解决方案:
运行它将输出: