我正在使用eclipse
我想在结构中保存名称,而不是我收到的原始副本作为参数,我做了这个,但它是错误的,因为免费的东西..但我必须在这个功能内部做免费我猜..当我尝试在eclipde中运行我的程序时,它只是告诉我我有什么不对,当我运行debbug时会发生同样的事情。我知道问题是免费的,因为如果我删除免费一切正常!
我有一个struct
例如:
typedef struct Ssomething {
int num;
char *name;
Level level;
} Something;
Result copy_name(Something *something, char *name) {
if (something == NULL || name == NULL) {
return NULL_PARAMETER;
}
char *name2 = malloc(strlen(name) + 1);
if (name2 == NULL) {
return MEMORY_PROBLEM;
}
memcpy(name2, name, strlen(name) + 1);
something->name = name2;
free(name2);
return OK;
}
我将问题更新到问题所在的位置!仍然没有找到解决方案:\
答案 0 :(得分:3)
if(something==NULL || name==NULL)
{
return NULL_PARAMETER;
}
然后将NULL传递给name
:init_something(something, 11, NULL, Hard);
。因此,您的函数不会执行任何操作,也不会检查自己的错误代码。
意味着something->num
未初始化,您致电printf("%d",something->num);
。
答案 1 :(得分:2)
你的copy_name
起初似乎做的一切都是正确的,但最后它free
分配了内存,因此使something->name
指针无效,从这个地址读取会导致崩溃。
当不再需要free
- 对象时,您必须保留内存并确保它为Something
d。
其他提示:
const
- 至少在名称输入指针strcpy
代替memcpy
复制字符串NULL_PARAMETER
)答案 2 :(得分:2)
这里有一些问题。
您正在释放在其他地方引用的内存。
ExcelColumn
您将结构名称属性设置为等于另一个指针,然后释放正在进行引用的内存,这称为Dangling Pointer如果要将name2中的值复制到名称中,只需像这样使用strcpy
def copy(self, **kwargs):
c = super().copy(**kwargs)
c._excel_column_name = self._excel_column_name
c._value_map = self._value_map
return c
您也没有为name属性分配任何内存,因此在将name2复制到名称之前,您需要这样做。
在这种情况下,您自己传递 memcpy(name2, name , strlen(name)+1);
something->name= name2;
free(name2);
作为char * name参数的参数,这将始终导致函数返回strcpy(something->name, name2);
,这将使得函数的其余部分不被评估,因此未设置null
属性,因此尝试在NULL_PARAMETER
中引用它最有可能导致程序崩溃。如果你想尝试检索那个属性,你需要使用条件逻辑来确保你的struct的属性已被设置。
num
答案 3 :(得分:0)
char *name2 = malloc(strlen(name) + 1);
if (name2 == NULL) {
return MEMORY_PROBLEM;
}
memcpy(name2, name, strlen(name) + 1);
something->name = name2;
free(name2); // BZZT. Here's your problem.
您为名称分配内存,将名称复制到,然后释放该内存。调用free
后,something->name
成为无效指针,因此稍后访问它会导致未定义的行为(在本例中为段错误)。
你真的不需要单独的name2
对象 - 可以简化为
something->name = malloc( strlen( name ) + 1 );
if ( something->name )
strcpy( something->name, name );
在您知道自己完成任务之前,不要免费something->name
。 free
free
之前,您需要something
free( something->name );
free( something );
修改强>
提供自己的分配和释放功能可能会有所帮助,例如
Something *newSomething( int num, const char *name, Level l )
{
Something *s = malloc( sizeof *s );
if ( s )
{
s->name = malloc( strlen( name ) + 1 );
if ( s->name )
strcpy( s->name, name );
s->num = num;
s->level = l;
}
return s;
}
void freeSomething( Something **s )
{
if ( *s )
{
if ( (*s)->name )
{
free( (*s)->name );
}
free( *s );
*s = NULL;
}
}
当然,这仅适用于动态分配的Something
个实例;您必须为分配为auto
或static
的实例执行不同的操作。