如何使用指向结构的指针调用函数?

时间:2017-05-05 13:36:01

标签: c eclipse pointers struct

我正在使用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;
}

我将问题更新到问题所在的位置!仍然没有找到解决方案:\

4 个答案:

答案 0 :(得分:3)

if(something==NULL || name==NULL)  
{
  return NULL_PARAMETER;
}

然后将NULL传递给nameinit_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)

这里有一些问题。

  1. 您正在释放在其他地方引用的内存。

    ExcelColumn

    您将结构名称属性设置为等于另一个指针,然后释放正在进行引用的内存,这称为Dangling Pointer如果要将name2中的值复制到名称中,只需像这样使用strcpy

  2. 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复制到名称之前,您需要这样做。

    1. 您正在调用init_something函数,然后检查可能为null的属性
    2. 在这种情况下,您自己传递 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->namefree 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个实例;您必须为分配为autostatic的实例执行不同的操作。