gpt4 book ai didi

C:缺少指针的一些逻辑

转载 作者:太空宇宙 更新时间:2023-11-04 05:15:39 24 4
gpt4 key购买 nike

我正在编写自己的字符串复制函数。以下作品:

char *src, *dest;
src = (char *) malloc(BUFFSIZE);
//Do something to fill the src
dest = (char *) malloc(strlen(src) + 1);
mystringcpy(src, dest);

void mystringcopy(char *src, char *dest) {
for(; (*dest = *src) != '\0'; ++src, +dest);
}

但这行不通:

char *src, *dest;
src = (char *) malloc(BUFFSIZE);
//Do something to fill the src
mystringcpy(src, strlen(src), dest);

void mystringcopy(char *src, size_t length, char *dest) {
dest = (char *)malloc(length + 1);
for(; (*dest = *src) != '\0'; ++src, +dest);
}

我不明白为什么...在被调用函数中分配内存是错误的吗?

最佳答案

您还没有真正说明“有效”是什么意思,但我假设您对为什么 dest 没有被更改为调用函数中的新内存感到困惑。

原因是在您的mystringcopy 函数中,参数dest 是指针dest副本在调用函数中。

然后您将该副本分配给一个新的缓冲区,进行复制,然后副本消失。原文不变。您需要将 dest 作为指针(指向指针)传递。

此外,我假设您是凭内存写的,因为它不应该按原样编译(调用函数中的错误取消引用)。这是固定代码:

char *src, *dest;
src = (char *)malloc(BUFFSIZE); // no dereference on src, it's a pointer

//Do something to fill the src
mystringcpy(src, strlen(src), &dest); // pass the address of dest

// take a pointer to a char*
void mystringcopy(char *src, size_t length, char **dest) {
// now you should dereference dest, to assign to
// the char* that was passed in
*dest = (char *)malloc(length + 1);

// for simplicity, make an auxiliary dest
char* destAux = *dest;

// and now the code is the same
for(; (*destAux = *src) != '\0'; ++src, ++destAux);
}

另一种方法是返回dest指针:

char *src, *dest;
src = (char *)malloc(BUFFSIZE);

//Do something to fill the src
dest = mystringcpy(src, strlen(src)); // assign dest

char* mystringcopy(char *src, size_t length) {
char* dest = (char *)malloc(length + 1);

// for simplicity, make an auxiliary dest
char* destAux = dest;

for(; (*destAux = *src) != '\0'; ++src, ++destAux);

return dest; // give it back
}

请记住,如果长度小于源缓冲区的实际长度,您将超出目标缓冲区。请参阅评论以获得解决方案,尽管这由您决定。

关于C:缺少指针的一些逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2164500/

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