我希望我的结构带有一个字符串。我是这样定义的:
typedef struct myStruct {
char* stringy
} myStruct
和一个函数
free(char *stringy){
//structObj is a struct object
structObj->stringy = stringy
}
这个对吗?我有一种感觉,既然是局部变量,stringy会丢失,指针会指向垃圾。
抱歉,C 的新手。
我希望我的结构带有一个字符串。我是这样定义的:
typedef struct myStruct {
char* stringy
} myStruct
和一个函数
free(char *stringy){
//structObj is a struct object
structObj->stringy = stringy
}
这个对吗?我有一种感觉,既然是局部变量,stringy会丢失,指针会指向垃圾。
抱歉,C 的新手。
如果在函数stringy
的调用者中定义free
,只要他们将实际字符串保留在其位置(位置stringy
点),就没有问题。
如果你以某种方式使用它会是垃圾char** stringy
,但它structObj->stringy = stringy
的意思是“你知道stringy
指向的东西吗?现在structObj->stringy
指向那个”。当然,仍然可以取消设置指针指向的值,此时取消引用将产生垃圾。
这是一个更清楚的示例:
#include<stdio.h>
typedef struct mStruct {
char* stringy;
} myStruct;
myStruct * structObj;
void doSomething(char* stringy)
{
structObj->stringy = stringy;
}
int main(int argc, char* argv)
{
char* a = "abc\n";
structObj = malloc(sizeof(myStruct));
doSomething(a);
a = "qxr\n";
printf(structObj->stringy);
}// prints "abc\n"
您的代码中没有任何局部变量声明。
您必须声明:
typedef struct myStruct {
char* stringy
} myStruct;
free(char *stringy){
myStruct *structObj;
structObj->stringy = stringy;
}
请注意我添加到 typedef 声明末尾的分号。
这不在您的代码中。
对象 structObj 是一个类型为 myStruct 的结构。
现在,您的参数 stringy 来自另一个站点,它不会丢失。
但是 struct structObj 将仅在您的“免费”函数内具有持续时间。
编辑
我修正了一个错误:正确的声明必须是“指向 structObj 的指针”,这是通过这种方式完成的:
myStruct *structObj;
注意现在 myStruct 是一个未初始化的指针,所以下面的赋值是合法的:
structObj->stringy = stringy;
但不会工作。
但是我认为这超出了原始问题的范围......
myStruct
是您为struct myStruct
.that 定义的类型,您需要在使用前创建一个对象。
你需要这样做:
typedef struct myStruct {
char *stringy;
} myStruct_t; //user defined data type
myStruct_t *obj;
// you need to allocate memory dynamically.
obj= (myStruct_t *) malloc(sizeof(myStruct_t));
用法:
scanf("%s",obj->stringy);
printf("%s",obj->stringy);
在功能上:
my_free(char *str) //str is local string
{
obj->stringy=str;
}
你也可以试试这个代码:
typedef struct myStruct {
char stringy[20]; //char *stringy
} myStruct_t; //user defined data type
myStruct_t obj; //object creation
用法:
scanf("%s",obj.stringy);
printf("%s",obj.stringy);
在功能上:
my_free(char *str) //str is local string
{
strcpy(obj.stringy,str);
}
你是对的,一旦它指向的内容超出范围,它就会指向垃圾:这是一个悬空指针。您需要分配一些内存并执行复制来解决此问题:
add_string(my_struct* s, const char* c)
{
size_t len = strlen(c);
s->file = malloc(len + 1);
strcpy(s->file, c);
}
不要忘记free
完成后你需要它:
void destroy_struct(my_struct* s)
{
free(s->file);
free(s);
}