gpt4 book ai didi

c - 字符串在函数调用后设为 NULL

转载 作者:行者123 更新时间:2023-12-02 08:09:42 25 4
gpt4 key购买 nike

我正在尝试在 C 中重新创建 C++ 函数 std::string.pop_back,其中输入字符串的最后一个非 NUL 字符被弹出。在 pop_back 函数中,变量 out 具有函数所需的输出,但试图将 *string 重新分配为 out 使 *string 成为函数关闭前的正确值(例如,如果我要在函数末尾打印 string*,它会输出 Hello World),但在main()中,调用pop_back()后,string输出为空。我在重新分配 string 时做错了什么?

#include <stdio.h>
#include <string.h>

void pop_back(char** string) {
size_t stringLen = strlen(*string);
char out[stringLen];

strxfrm(out, *string, stringLen);
// Here *string == "Hello World!"
*string = out;
// Here *string == "Hello World"
}

int main(int argc, char* argv[]) {
char* string = "Hello World!";
printf("Initial string: %s\n", string);
pop_back(&string);
printf("After pop_back: %s\n", string);
return 0;
}

// Output:
// $ ./pop_back_test
// Initial string: Hello World!
// After pop_back:

// Expected output:
// $ ./pop_back_test
// Initial string: Hello World!
// After pop_back: Hello World

最佳答案

用你的代码

char out[stringLen];
...
*string = out;

您“返回”(分配给参数)指向“局部变量”的指针,即指向具有自动存储持续时间的对象的指针,该对象的生命周期在函数结束时结束。访问超出其生命周期的对象是未定义的行为。

您可能必须动态分配一个新字符串,然后您可以在函数执行结束后对其进行操作和使用。例如:

if (!(*string) || !(**string)) {
// decide what to do with NULL or empty input strings.
...
}
else {
size_t stringLen = strlen(*string);
char* out = malloc(stringLen);
memcpy(out, *string, stringLen);
out[stringLen-1] = '\0';
}

*string = out;

之后不要忘记释放分配的内存。顺便说一句:如果你对一个副本进行操作,我建议返回(新)副本并保持输入指针不变,即我将原型(prototype)更改为

char* pop_back(char* string) {
...
return out;
}

关于c - 字符串在函数调用后设为 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48443352/

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