gpt4 book ai didi

c - 练习题

转载 作者:太空宇宙 更新时间:2023-11-04 08:35:37 26 4
gpt4 key购买 nike

这是一道练习题,我遇到了一些困难:

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 得到垃圾输出。我还确定 personname 在调用 keepname 函数后确实是“Waterman”。我已经尝试将 person.name 取消引用到 person -> name,通过消除 & 运算符和 malloc- 将问题从基于堆栈的问题更改为基于堆的问题结构,但没有任何效果。谁能引导我朝着正确的方向前进?提前谢谢你。

最佳答案

Is there an error?

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

};

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

现在错误接踵而至。:)

函数 main 应声明为

int main( void )

虽然这不是错误,但在函数调用之前最好有函数原型(prototype)

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

关于c - 练习题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26343018/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com