Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 关注结构指针_C_Pointers_Struct - Fatal编程技术网

C 关注结构指针

C 关注结构指针,c,pointers,struct,C,Pointers,Struct,我正在做一个项目,我们的教授给我们的代码中包含了我们无法更改的变量和原型声明。一个是结构,带有指向该结构的指针,其类型定义为pStudentRecord: typedef struct { char* firstName; char* lastName; int id; float mark; }* pStudentRecord; 带有指向此类型的指针,称为g\u ppRecords。这将是指向上述结构的指针的动态数组 这就是我的问题所在。这些记录将从文件中读取。如果指定的文件

我正在做一个项目,我们的教授给我们的代码中包含了我们无法更改的变量和原型声明。一个是结构,带有指向该结构的指针,其类型定义为
pStudentRecord

typedef struct
{
  char* firstName;
  char* lastName;
  int id;
  float mark;
}* pStudentRecord;
带有指向此类型的指针,称为
g\u ppRecords
。这将是指向上述结构的指针的动态数组

这就是我的问题所在。这些记录将从文件中读取。如果指定的文件名不存在,则会创建一个新文件名。每当用户添加第一条新记录时,我将初始化
g\u ppRecords
指针:

if(!n) //where n = number of records
  g_ppRecords = (pStudentRecord*)  malloc(sizeof(pStudentRecord));

g_ppRecords[n] = (pStudentRecord) malloc(16);

到目前为止,每次我运行这段代码时,它都会工作,但我不确定如何运行。如果添加更多记录,则将在
g\u ppRecords
中的下一个位置创建新指针(
pStudentRecord
)。据我所知,我还没有为新指针分配空间,但每次它工作时都没有任何问题的迹象。我可以很好地访问新结构的成员,并且不会出现堆损坏错误或访问冲突之类的情况。我的担心是正确的还是怀疑自己?

根据您展示的代码,您的担心是有效的

这一行:

g_ppRecords = (pStudentRecord*)  malloc(sizeof(pStudentRecord));
仅为单个
pStudentRecord
分配足够的空间。将其视为一个只有一个元素的
pStudentRecord
数组,位于
g\u ppRecords[0]

如果我添加了更多记录,那么将在
g\u ppRecords
中的下一个位置创建一个新指针(pStudentRecord)

现在的问题是,当你做你在这里描述的事情时,可能会发生什么。添加新指针时会发生什么情况?除非您使用
realloc
g\u ppRecords
获得更多空间,否则该数组中没有空间容纳更多指向记录的指针。如果您
malloc
将新指针指向第二个元素,即:

g_ppRecords[1] = (pStudentRecord) malloc(16);
然后您正在使用尚未分配的内存,
g\u ppRecords[1]
。这看起来可能有效,但这段记忆不属于你。继续添加新指针,最终你的程序会崩溃。或者,您的程序可能会因为代码的另一部分中完全无关的内容而中断

解决方法是,您应该首先分配数组,以便它可以容纳多个指针,而不是只容纳一个指针。如何使用第一行
malloc
实现这一点


我应该补充一点,当您使用
malloc(16)
struct
分配内存时,您正在对不应该创建的数据结构进行假设,特别是
struct
将始终占用16个字节。给定您的
typedef
:直接从匿名
结构指向指针,您可以将
16
更改为更一般的内容,但这与您的问题没有直接关系,您应该向您的教授询问。

根据您展示的代码,您的担忧是有效的

typedef struct
{
  char* firstName;
  char* lastName;
  int id;
  float mark;
}* pStudentRecord;
这一行:

g_ppRecords = (pStudentRecord*)  malloc(sizeof(pStudentRecord));
仅为单个
pStudentRecord
分配足够的空间。将其视为一个只有一个元素的
pStudentRecord
数组,位于
g\u ppRecords[0]

如果我添加了更多记录,那么将在
g\u ppRecords
中的下一个位置创建一个新指针(pStudentRecord)

现在的问题是,当你做你在这里描述的事情时,可能会发生什么。添加新指针时会发生什么情况?除非您使用
realloc
g\u ppRecords
获得更多空间,否则该数组中没有空间容纳更多指向记录的指针。如果您
malloc
将新指针指向第二个元素,即:

g_ppRecords[1] = (pStudentRecord) malloc(16);
然后您正在使用尚未分配的内存,
g\u ppRecords[1]
。这看起来可能有效,但这段记忆不属于你。继续添加新指针,最终你的程序会崩溃。或者,您的程序可能会因为代码的另一部分中完全无关的内容而中断

解决方法是,您应该首先分配数组,以便它可以容纳多个指针,而不是只容纳一个指针。如何使用第一行
malloc
实现这一点

我应该补充一点,当您使用
malloc(16)
struct
分配内存时,您正在对不应该创建的数据结构进行假设,特别是
struct
将始终占用16个字节。给定您的
typedef
:直接从匿名
struct
指向指针,您可以将
16
更改为更一般的内容,但这与您的问题没有直接关系,您应该向教授询问

typedef struct
{
  char* firstName;
  char* lastName;
  int id;
  float mark;
}* pStudentRecord;
这是一个匿名结构。这里有点奇怪,但也许是教你一些东西。执行以下操作以创建一个新的:

pStudentRecord ptr;
ptr = malloc(sizeof(*ptr));
这将自动分配适当的内存量

您仍然有问题,因为需要malloc数组来保存指针。为此,请执行以下操作:

pStudentRecord* g_ppRecords = malloc(n * sizeof(pStudentRecord));
然后,您可以像这样使用g_ppRecords:

pStudentRecord ptr = g_ppRecords[3];
总而言之,我们有自己的自定义分配器:

pStudentRecord* g_ppRecords = malloc(n * sizeof(pStudentRecord));

for (size_t i = 0; i < n; ++i)
{
  pStudentRecord ptr;
  g_ppRecords[i] = malloc(sizeof(*ptr));
}
pStudentRecord*g_ppRecords=malloc(n*sizeof(pStudentRecord));
对于(尺寸i=0;i
我没有编译和测试就写了这些,所以可能会有错误(但这不是我的家庭作业:-)

这是一个匿名结构。这里有点奇怪,但也许是教你一些东西。执行以下操作以创建一个新的:

pStudentRecord ptr;
ptr = malloc(sizeof(*ptr));
这将自动分配适当的内存量

您仍然有问题,因为需要malloc数组来保存指针。为此,请执行以下操作:

pStudentRecord* g_ppRecords = malloc(n * sizeof(pStudentRecord));
然后,您可以像这样使用g_ppRecords:

pStudentRecord ptr = g_ppRecords[3];
总而言之,我们有自己的自定义分配器:

pStudentRecord* g_ppRecords = malloc(n * sizeof(pStudentRecord));

for (size_t i = 0; i < n; ++i)
{
  pStudentRecord ptr;
  g_ppRecords[i] = malloc(sizeof(*ptr));
}
pStudentRecord*g_ppRecords=malloc(n*sizeof(pStudentRecord));
对于(尺寸i=0;i
我写了一封信