这是一个练习题考试,我遇到了一些困难:
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结构,将问题从基于堆栈的问题转换为基于堆的问题,但没有任何效果。任何人都可以引导我朝着正确的方向前进吗?提前谢谢。
答案 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函数strlen
和strcpy
。