练习考试题

时间:2014-10-13 15:00:25

标签: c

这是一个练习题考试,我遇到了一些困难:

struct bodytp // Is there an error?
{
    char *name; // If so, fix the error.
    int len;
};

main()  
{
      struct bodytp person;
      keepname(&person , "Waterman");
      printf("%s\n", person.name); 
}

void keepname(struct bodytp *onept, const char *last)
{
    int len;
    char *tpt;
    for ( len = 0; last[len] != '\0'; )
    len++;
    char name[len+1];
    for ( tpt = name; *tpt++ = *last++; )
    ;
    onept->name = name;
    onept->len = len;
}

我已经确定存在错误,因为当我运行它时,我从printf获得垃圾输出。在keepname函数调用之后,我还确定person的{​​{1}}确实是“Waterman”。我尝试将name解除引用到person.name,通过消除&符号运算符和malloc结构,将问题从基于堆栈的问题转换为基于堆的问题,但没有任何效果。任何人都可以引导我朝着正确的方向前进吗?提前谢谢。

2 个答案:

答案 0 :(得分:0)

您需要为堆中的名称分配内存。

void keepname(struct bodytp *onept, const char *last)
{
    int len;
    char *tpt;
    for ( len = 0; last[len] != '\0';len++);
    char *name=malloc(len+1);
    onept->name = name;
    onept->len = len;
    for ( ; *name++ = *last++ ; ); 
}

答案 1 :(得分:0)

  

有错误吗?

struct bodytp // Is there an error?
{
    char *name; // If so, fix the error.
    int len;

};

没有错误。这是一个有效的结构定义。

现在出现错误。:)

函数main应声明为

int main( void )

虽然这不是一个错误但是在函数调用之前会有更好的函数原型

keepname(&person , "Waterman");

程序具有未定义的行为,因为通过本地数组的地址分配了一个指向结构的指针,该数据将在退出函数后被销毁

void keepname(struct bodytp *onept, const char *last)
{
    //...
    char name[len+1];
    //...
    onept->name = name;
    //...
}

有效功能可以定义为

void keepname(struct bodytp *onept, const char *last)
{
    int len = 0;
    char *tpt;

    while ( last[len] != '\0' ) len++;

    char *name = malloc( len + 1 );

    for ( tpt = name; *tpt++ = *last++; ) ;

    onept->name = name;
    onept->len = len;
}

在这种情况下,您必须释放main中的已分配内存。

考虑到你在函数中使用标准C函数strlenstrcpy

相关问题