我可以使用strdup
分配值并使用以下命令打印值:(*test + index)->email
,但是我不知道如何释放分配给可变电子邮件的内存。我曾考虑过释放test+index
,但我想这会导致内存泄漏,对吗?考虑到该结构已分配了内存,并且其中的每个指针都分配有strdup
的内存。
编辑:
代码大致如下:
struct random {
char *email;
} Random;
void function(Random **struct) {
char *temp = calloc(100, sizeof(char));
*struct = calloc(5, sizeof(Random));
for (int i = 0; i < 5; i++) {
scanf("%s", temp);
(*struct + i)->email = strdup(temp); //This works
}
free((*struct + 3)->email); //Gives segmentation fault
}
int main() {
Random *struct;
function(&struct)
}
答案 0 :(得分:1)
如果我没记错的话,不是吗?
free(*(test+index)->email);
free(text+index);
答案 1 :(得分:1)
发布的代码无法编译:
struct
作为变量的名称。 struct
是关键字。Random
是全局变量,而不是类型。在C语言中,返回结果而不是将其地址作为参数传递是一种习惯用法,并且要简单得多。
在遵循这些说明并添加基本检查之后,代码应简化为:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Random {
char *email;
} Random;
Random *function(void) {
char *temp = calloc(100, sizeof(char));
if (temp == NULL)
return NULL;
Random *s = calloc(5, sizeof(Random));
if (s != NULL) {
for (int i = 0; i < 5; i++) {
if (scanf("%99s", temp) != 1)
*temp = '\0';
(s + i)->email = strdup(temp); //This works
}
free((s + 3)->email); //Gives segmentation fault
}
free(temp);
return s;
}
int main() {
Random *s = function();
// ...
}
此代码在语义上等同于您发布的片段,在您指示的地方没有未定义的行为,您的实际代码必须在做其他事情。
答案 2 :(得分:0)
请阅读/理解:precedence of C operators
然后请注意,取消引用运算符*
的优先级低于+
运算符,
因此,需要修改发布的代码以使用类似以下内容的
(*mystruct)+i = ...
等否则,+
将在*