是否会为 typedef 结构指针分配内存?
Will memory be allocated for a typedef structure pointer?
我有以下程序,其中有一个结构。我要为其分配一些值并将其写入文件。
但这里的困惑是,我刚刚声明了一个指向结构的指针,还没有分配内存。那么变量赋值是如何工作的呢?
我能够从文件“/home/info”
中正确检索值
#include <stdio.h>
#define FILEE "/home/info"
typedef struct my_info
{
int i;
int j;
int k;
int l;
}_my_info;
void main()
{
_my_info *my_info;
int fd;
FILE *fp;
my_info->i=100;
my_info->j=300;
my_info->k=200;
my_info->l=400;
fp = fopen(FILEE,"w");
if (fp == NULL)
printf("Error in opening file\n");
fd=fwrite(my_info, sizeof(_my_info), 1, fp);
if (fd<0)
printf("Error while writing\n");
fclose(fp);
}
由于 my_info
指针存在于堆栈中,因此很可能之前使用过相同的位置并指向一些已分配的内存。您正在覆盖一些其他数据,这可能会或可能不会导致您的程序崩溃。
简而言之 - 它的工作是偶然的。
由于你没有初始化指针变量,它的值是随机的,意味着指针指向某个随机地址。
访问地址时,根据你的OS,它可能会崩溃,或者只是得到一些垃圾数据。
当你声明时 my_info
_my_info *my_info;
它将有一个 undefined 值。在您的情况下, my_info
的值在 RAM 的有效内存地址范围内。所以写入它,然后读取它。
但是,您并不知道您因此而更改了其他哪些内存。这可能会导致内存损坏,尤其是在较大的程序中。
您当前的代码存在几个问题。在到达结构问题之前,您似乎将 write
和 fwrite
中的 return 值与:
混淆了
fd=fwrite(my_info, sizeof(_my_info), 1, fp);
if (fd<0)
printf("Error while writing\n");
fwrite
return 值是类型 size_t
。它 永远不会 小于 0
。如果您使用 warnings-enabled(例如 -Wall -Wextra
)进行编译,您将始终收到关于比较总是测试错误的警告。
关于 space 你的结构,你为什么要声明一个指针?除非你在你的例子中有一些声明指针的压倒一切的理由,否则只需声明该结构的静态实例,这样存储就会自动保留。如果你确实声明了一个指针,那么你必须分配 space (例如 _my_info *my_info = malloc (sizeof *my_info);
或 _my_info *my_info = calloc (1, sizeof *my_info);
)
对于您的示例,除了通过动态分配练习外,没有理由声明指针,只需声明一个实例即可。以下是使用文件中的实例和 writing/reading 值的简短示例。 (注意: 关于 int main()
的评论——以及将默认文件名更改为 /tmp/info.bin
):
#include <stdio.h>
#define FILEE "/tmp/info.bin"
typedef struct {
int i;
int j;
int k;
int l;
} _my_info;
/* main is type 'int', has arguments and returns a value */
int main (int argc, char **argv)
{
_my_info my_info, my_info2; /* static instances */
/* write to given filename, or FILEE (default) */
FILE *fp = fopen (argc > 1 ? argv[1] : FILEE, "wb");
if (!fp) {
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
my_info.i = 100;
my_info.j = 300;
my_info.k = 200;
my_info.l = 400;
if (fwrite (&my_info, sizeof my_info, 1, fp) < 1) {
fprintf (stderr, "error: write to '%s' failed\n",
argc > 1 ? argv[1] : FILEE);
return 1;
}
if (fclose(fp) == EOF) goto errclose;
printf ("\n values written to : %s\n", argc > 1 ? argv[1] : FILEE);
/* reopen file for reading, read values into my_info2 */
fp = fopen (argc > 1 ? argv[1] : FILEE, "rb");
if (fread (&my_info2, sizeof my_info2, 1, fp) < 1) {
fprintf (stderr, "error: read from '%s' failed\n",
argc > 1 ? argv[1] : FILEE);
return 1;
}
if (fclose(fp) == EOF) goto errclose;
printf (" values read from : %s\n\n", argc > 1 ? argv[1] : FILEE);
printf (" my_info2.i : %d\n my_info2.j : %d\n"
" my_info2.k : %d\n my_info2.l : %d\n\n",
my_info2.i, my_info2.j, my_info2.k, my_info2.l);
return 0;
errclose:
fprintf (stderr, "error: EOF returned on stream close.\n");
return 1;
}
输出
$ ./bin/struct_write
values written to : /tmp/info.bin
values read from : /tmp/info.bin
my_info2.i : 100
my_info2.j : 300
my_info2.k : 200
my_info2.l : 400
如果您还有其他问题,请告诉我;如果您迫切需要使用指向结构的指针,请告诉我,我很乐意进一步帮助您。
我有以下程序,其中有一个结构。我要为其分配一些值并将其写入文件。 但这里的困惑是,我刚刚声明了一个指向结构的指针,还没有分配内存。那么变量赋值是如何工作的呢? 我能够从文件“/home/info”
中正确检索值#include <stdio.h>
#define FILEE "/home/info"
typedef struct my_info
{
int i;
int j;
int k;
int l;
}_my_info;
void main()
{
_my_info *my_info;
int fd;
FILE *fp;
my_info->i=100;
my_info->j=300;
my_info->k=200;
my_info->l=400;
fp = fopen(FILEE,"w");
if (fp == NULL)
printf("Error in opening file\n");
fd=fwrite(my_info, sizeof(_my_info), 1, fp);
if (fd<0)
printf("Error while writing\n");
fclose(fp);
}
由于 my_info
指针存在于堆栈中,因此很可能之前使用过相同的位置并指向一些已分配的内存。您正在覆盖一些其他数据,这可能会或可能不会导致您的程序崩溃。
简而言之 - 它的工作是偶然的。
由于你没有初始化指针变量,它的值是随机的,意味着指针指向某个随机地址。 访问地址时,根据你的OS,它可能会崩溃,或者只是得到一些垃圾数据。
当你声明时 my_info
_my_info *my_info;
它将有一个 undefined 值。在您的情况下, my_info
的值在 RAM 的有效内存地址范围内。所以写入它,然后读取它。
但是,您并不知道您因此而更改了其他哪些内存。这可能会导致内存损坏,尤其是在较大的程序中。
您当前的代码存在几个问题。在到达结构问题之前,您似乎将 write
和 fwrite
中的 return 值与:
fd=fwrite(my_info, sizeof(_my_info), 1, fp);
if (fd<0)
printf("Error while writing\n");
fwrite
return 值是类型 size_t
。它 永远不会 小于 0
。如果您使用 warnings-enabled(例如 -Wall -Wextra
)进行编译,您将始终收到关于比较总是测试错误的警告。
关于 space 你的结构,你为什么要声明一个指针?除非你在你的例子中有一些声明指针的压倒一切的理由,否则只需声明该结构的静态实例,这样存储就会自动保留。如果你确实声明了一个指针,那么你必须分配 space (例如 _my_info *my_info = malloc (sizeof *my_info);
或 _my_info *my_info = calloc (1, sizeof *my_info);
)
对于您的示例,除了通过动态分配练习外,没有理由声明指针,只需声明一个实例即可。以下是使用文件中的实例和 writing/reading 值的简短示例。 (注意: 关于 int main()
的评论——以及将默认文件名更改为 /tmp/info.bin
):
#include <stdio.h>
#define FILEE "/tmp/info.bin"
typedef struct {
int i;
int j;
int k;
int l;
} _my_info;
/* main is type 'int', has arguments and returns a value */
int main (int argc, char **argv)
{
_my_info my_info, my_info2; /* static instances */
/* write to given filename, or FILEE (default) */
FILE *fp = fopen (argc > 1 ? argv[1] : FILEE, "wb");
if (!fp) {
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
my_info.i = 100;
my_info.j = 300;
my_info.k = 200;
my_info.l = 400;
if (fwrite (&my_info, sizeof my_info, 1, fp) < 1) {
fprintf (stderr, "error: write to '%s' failed\n",
argc > 1 ? argv[1] : FILEE);
return 1;
}
if (fclose(fp) == EOF) goto errclose;
printf ("\n values written to : %s\n", argc > 1 ? argv[1] : FILEE);
/* reopen file for reading, read values into my_info2 */
fp = fopen (argc > 1 ? argv[1] : FILEE, "rb");
if (fread (&my_info2, sizeof my_info2, 1, fp) < 1) {
fprintf (stderr, "error: read from '%s' failed\n",
argc > 1 ? argv[1] : FILEE);
return 1;
}
if (fclose(fp) == EOF) goto errclose;
printf (" values read from : %s\n\n", argc > 1 ? argv[1] : FILEE);
printf (" my_info2.i : %d\n my_info2.j : %d\n"
" my_info2.k : %d\n my_info2.l : %d\n\n",
my_info2.i, my_info2.j, my_info2.k, my_info2.l);
return 0;
errclose:
fprintf (stderr, "error: EOF returned on stream close.\n");
return 1;
}
输出
$ ./bin/struct_write
values written to : /tmp/info.bin
values read from : /tmp/info.bin
my_info2.i : 100
my_info2.j : 300
my_info2.k : 200
my_info2.l : 400
如果您还有其他问题,请告诉我;如果您迫切需要使用指向结构的指针,请告诉我,我很乐意进一步帮助您。