我希望我的结构体可以携带一个字符串。 我这样定义了它:
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语言还不熟悉。
如果你在某种情况下使用了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;
}
myStruct *structObj;
structObj->stringy = stringy;
free
函数的时候,stringy
被定义,并且只要保持实际字符串在它所指向的位置,就不会有问题。myStruct
是你为 struct myStruct
定义的类型。在使用之前,你需要先创建一个对象。
你需要按照以下方式操作:
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);
}