结构的 Malloc'ing 指针到指针成员
Malloc'ing pointer-to-pointer member of struct
我正在尝试使用一个结构来保存指向数据块的指针,当文件更新时我有时会更改该数据块,我的想法是释放旧数据块,malloc 一个大小合适的新数据块,并将结构中指向指针的指针分配给由 malloc 编辑的指针 return,这就是我认为我应该这样做的方式。但它会出现故障。事实上,在我缩减以制作此测试程序的较大程序中,它不是段错误,而是写入 stdout 在 malloc 之后(程序中之后的任何地方)什么都不做。我想我正在写标准输出 FD,原因是当我将指针设置为 malloc()
ed return 值时我使用的指针不正确。
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <string.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <malloc.h>
#include <inttypes.h>
struct mystruct {
int offset;
int ** d;
};
int filecheck (struct mystruct *g, int * count) {
int v, size = 0;
FILE *f = fopen("/home/pi/schedule/default", "rb");
if (f == NULL) {
return 0;
}
fseek(f, 0, SEEK_END);
size = ftell(f);
fseek(f, 0, SEEK_SET);
int schedsize = sizeof(int);
int elementcount = size / schedsize;
// free(*(g->d));
// seg fault next line
if ((*(g->d) = malloc(size))==NULL) return 0;
if (elementcount != fread(*(g->d), schedsize, elementcount, f)) {
free(*(g->d));
return 0;
}
fclose(f);
*count = elementcount;
return 1;
}
void setp (struct mystruct *g) {
// if uncommented, seg fault here
// *(g->d) = NULL;
}
int main (){
struct mystruct g;
setp(&g);
int i, count = 0;
if (filecheck(&g, &count)==0) {
printf("Returned 0\n");
return 0;
}
while (1) {
printf("%d\n", (*(g.d))[i]);
sleep(1);
}
return 0;
}
为了方便起见,我最初想在 setp()
中将 mystruct.d
设置为 NULL
,但即使将其注释掉,代码仍然失败,所以我知道这是完全错误的。也许我不需要使用指向指针的指针,但在我看来我需要。
编辑:根据答案修改,这样可以吗?
struct mystruct {
int offset;
int * d;
};
int filecheck (struct mystruct *g, int * count) {
int v, size = 0;
FILE *f = fopen("/home/pi/schedule/default", "rb");
if (f == NULL) {
return 0;
}
fseek(f, 0, SEEK_END);
size = ftell(f);
fseek(f, 0, SEEK_SET);
int schedsize = sizeof(int);
int elementcount = size / schedsize;
free (g->d);
if ((g->d = malloc(size))==NULL) return 0;
if (elementcount != fread(g->d, schedsize, elementcount, f)) {
free(g->d);
return 0;
}
fclose(f);
*count = elementcount;
return 1;
}
void setp (struct mystruct *g) {
g->d = NULL;
}
int main (){
struct mystruct g;
setp(&g);
int i, count = 0;
if (filecheck(&g, &count)==0) {
printf("Returned 0\n");
return 0;
}
while (1) {
for (i=0;i<count;i++) {
printf("%d %d \n", *((g.d)+i), g.d[i]);
}
sleep(1);
}
return 0;
}
这似乎有效,但它是否正确,或者我是否覆盖了我不应该再次使用的内存的某些部分?
您需要为所有指针元素分配内存才能使用它们。
这里,d
是指向指针的指针,首先你需要为d
本身分配内存,然后你应该继续解引用d
(使用*d
).
例如,
void setp (struct mystruct *g) {
g->d = NULL; // no need to derererence d here, but later need to allocate
}
或者,(更好)
void setp (struct mystruct *g) {
g->d = malloc(32 * sizeof (int *)); // d is allocated
g->d[i] = malloc(16 * sizeof (int)); // or g->d[i] = NULL; or *(g->d) = NULL;
}
应该可以正常工作。
此外,main()
的推荐签名是int main(void)
。
我正在尝试使用一个结构来保存指向数据块的指针,当文件更新时我有时会更改该数据块,我的想法是释放旧数据块,malloc 一个大小合适的新数据块,并将结构中指向指针的指针分配给由 malloc 编辑的指针 return,这就是我认为我应该这样做的方式。但它会出现故障。事实上,在我缩减以制作此测试程序的较大程序中,它不是段错误,而是写入 stdout 在 malloc 之后(程序中之后的任何地方)什么都不做。我想我正在写标准输出 FD,原因是当我将指针设置为 malloc()
ed return 值时我使用的指针不正确。
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <string.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <malloc.h>
#include <inttypes.h>
struct mystruct {
int offset;
int ** d;
};
int filecheck (struct mystruct *g, int * count) {
int v, size = 0;
FILE *f = fopen("/home/pi/schedule/default", "rb");
if (f == NULL) {
return 0;
}
fseek(f, 0, SEEK_END);
size = ftell(f);
fseek(f, 0, SEEK_SET);
int schedsize = sizeof(int);
int elementcount = size / schedsize;
// free(*(g->d));
// seg fault next line
if ((*(g->d) = malloc(size))==NULL) return 0;
if (elementcount != fread(*(g->d), schedsize, elementcount, f)) {
free(*(g->d));
return 0;
}
fclose(f);
*count = elementcount;
return 1;
}
void setp (struct mystruct *g) {
// if uncommented, seg fault here
// *(g->d) = NULL;
}
int main (){
struct mystruct g;
setp(&g);
int i, count = 0;
if (filecheck(&g, &count)==0) {
printf("Returned 0\n");
return 0;
}
while (1) {
printf("%d\n", (*(g.d))[i]);
sleep(1);
}
return 0;
}
为了方便起见,我最初想在 setp()
中将 mystruct.d
设置为 NULL
,但即使将其注释掉,代码仍然失败,所以我知道这是完全错误的。也许我不需要使用指向指针的指针,但在我看来我需要。
编辑:根据答案修改,这样可以吗?
struct mystruct {
int offset;
int * d;
};
int filecheck (struct mystruct *g, int * count) {
int v, size = 0;
FILE *f = fopen("/home/pi/schedule/default", "rb");
if (f == NULL) {
return 0;
}
fseek(f, 0, SEEK_END);
size = ftell(f);
fseek(f, 0, SEEK_SET);
int schedsize = sizeof(int);
int elementcount = size / schedsize;
free (g->d);
if ((g->d = malloc(size))==NULL) return 0;
if (elementcount != fread(g->d, schedsize, elementcount, f)) {
free(g->d);
return 0;
}
fclose(f);
*count = elementcount;
return 1;
}
void setp (struct mystruct *g) {
g->d = NULL;
}
int main (){
struct mystruct g;
setp(&g);
int i, count = 0;
if (filecheck(&g, &count)==0) {
printf("Returned 0\n");
return 0;
}
while (1) {
for (i=0;i<count;i++) {
printf("%d %d \n", *((g.d)+i), g.d[i]);
}
sleep(1);
}
return 0;
}
这似乎有效,但它是否正确,或者我是否覆盖了我不应该再次使用的内存的某些部分?
您需要为所有指针元素分配内存才能使用它们。
这里,d
是指向指针的指针,首先你需要为d
本身分配内存,然后你应该继续解引用d
(使用*d
).
例如,
void setp (struct mystruct *g) {
g->d = NULL; // no need to derererence d here, but later need to allocate
}
或者,(更好)
void setp (struct mystruct *g) {
g->d = malloc(32 * sizeof (int *)); // d is allocated
g->d[i] = malloc(16 * sizeof (int)); // or g->d[i] = NULL; or *(g->d) = NULL;
}
应该可以正常工作。
此外,main()
的推荐签名是int main(void)
。