【发布时间】:2014-08-19 14:27:21
【问题描述】:
我试图在函数内分配一个结构数组,但是当我返回 main 时,就像我刚刚分配的内存已被覆盖。这是我的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Class {
int students;
Person * N;
};
struct Person
{
char * name;
int age;
};
void allocation(struct Class ** myclasspointer)
{
struct Class *mytempstruct= malloc(sizeof *mytempstruct);
mytempstruct -> students = 10;
char *n= "My name is...?";
mytempstruct -> N = malloc (sizeof (mytempstruct -> N) * 10);
for (i = 0; i < 10; i++) {
mytempstruct -> N[i].age = i;
mytempstruct -> N[i].name = malloc (sizeof (char) * (strlen(n));
strncpy (N[i].name, n, strlen(n));
}
*myclasspointer = mytempstruct;
}
int main(void)
{
int i;
struct class * MyClass;
allocation(&MyClass);
for (int i = 0; i < MyClass.students; i++)
Prinf("Student %s, age %d: %d \n", MyClass->N[i].name, MyClass->N[i].age);
for (int i = 0; i < MyClass->students; i++)
free(MyClass->N[i]);
free (MyClass);
return 0;
}
一旦我回到 main,只有一些值是应该的。我也尝试过改变:
void allocation(struct Class ** myclasspointer)
{
struct Class *mytempstruct= malloc(sizeof *mytempstruct);
char *n= "My name is...?";
mytempstruct -> N = malloc (sizeof (mytempstruct -> N) * 10);
for (i = 0; i < 10; i++) {
mytempstruct -> N[i].age = i;
mytempstruct -> N[i].name = malloc (sizeof (char) * (strlen(n));
}
*myclasspointer = mytempstruct;
}
到:
void allocation(struct Class ** myclasspointer)
{
myclasspointer= malloc(sizeof *myclasspointer);
char *n= "My name is...?";
myclasspointer-> N = malloc (sizeof (myclasspointer-> N) * 10);
for (i = 0; i < 10; i++) {
mytempstruct -> N[i].age = i;
mytempstruct -> N[i].name = malloc (sizeof (char) * (strlen(n));
}
}
但我有同样的结果。
【问题讨论】:
-
您的代码甚至无法编译!
-
strncpy(dst, src, strlen(src))与strcpy(dst, src)相比没有任何作用(除了给某些人一种虚假的安全感)。 -
代码有什么问题?
-
malloc (sizeof (char) * (strlen(n));-->malloc (sizeof (char) * (strlen(n)+1)); -
free(MyClass->N[i]);-->free(MyClass->N[i].name);并添加free(MyClass->N);
标签: c function memory-management struct