我希望我的struct携带一个字符串。我这样定义:
typedef struct myStruct {
char* stringy
} myStruct
和一个功能
free(char *stringy){
//structObj is a struct object
structObj->stringy = stringy
}
这是对的吗?我有一种感觉,因为它是一个局部变量,stringy将丢失,指针将指向垃圾。
对不起,C新手。
答案 0 :(得分:1)
如果在stringy
函数的调用者中定义free
,只要它们将实际字符串保留在其位置(stringy
点),就没问题。
答案 1 :(得分:1)
如果你以某种方式使用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"
答案 2 :(得分:1)
您的代码中没有任何本地变量声明。
您必须声明:
typedef struct myStruct {
char* stringy
} myStruct;
free(char *stringy){
myStruct *structObj;
structObj->stringy = stringy;
}
注意我添加到typedef声明末尾的分号 这不是在你的代码中。
对象structObj是一个类型为myStruct的结构体。
现在,您的参数stringy来自另一个网站,它不会丢失 但struct structObj只在你的“free”函数中有持续时间。
编辑
我修正了一个错误:正确的声明必须是“指向structObj的指针”,这是以这种方式完成的:
myStruct *structObj;
观察现在myStruct是一个非初始化指针,因此以下赋值是合法的:
structObj->stringy = stringy;
但不起作用。
但我认为这超出了原始问题的范围......
答案 3 :(得分:0)
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);
}
答案 4 :(得分:-1)
你是正确的,只要它指出的范围超出范围,它就会指向垃圾:这是一个悬空指针。你需要分配一些内存并执行一个副本来解决这个问题:
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);
}