gpt4 book ai didi

c - 为什么字符串值没有在我的 C 代码中更新?

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

我不明白我的代码有什么问题。我为字符串分配了空间,并通过引用 unparse_symbol 函数传递了它。虽然,不知何故 str 没有被设置为我在 switch 语句中证明的字符串,例如str = "ADD"不会将 str 设置为 "ADD"。我真的不明白是什么问题..分配空间并传递指针。

感谢您的帮助!

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

typedef enum {ADD, MULT, MINUS, DIV, MOD, BAD} op_type;

void unparse_symbol(op_type op, char *str)
{
switch (op) {
case ADD:
str = "ADD";
break;
case MULT:
str = "MULT";
break;
case MINUS:
str = "MINUS";
break;
case DIV:
str = "DIV";
break;
case MOD:
str = "MOD";
break;
case BAD:
str = "BAD";
break;

default: str = "DEFAULT_CASE";
}
return;
}

int main(void){

char *string = calloc(10, 1);
op_type add = ADD;
unparse_symbol(add, string);
printf("%s \n", string);

return 0;
}

最佳答案

在函数unparse_symbol 中,参数str 是函数的局部变量。退出函数后,这个局部变量将不存在。在函数内更改此局部变量不会影响作为参数传递的原始对象。

你应该像这样声明函数

void unparse_symbol(op_type op, char **str)

并在函数内使用类似这样的赋值

  switch (op) {
case ADD:
*str = "ADD";
break;

程序中还存在内存泄漏。要转义它,您可以按以下方式定义函数

void unparse_symbol(op_type op, char *str)
{
switch (op) {
case ADD:
strcpy( str, "ADD" );
break;

所以要么删除内存分配并将函数定义为

void unparse_symbol(op_type op, char **str)

在 switch 语句中使用对指针的赋值

或保留相同的函数声明,但使用函数 strcpy 将字符串文字复制到指针指向的已分配内存中。

在最后一种情况下,您需要使用函数 free 释放分配的内存

free( str );

还要考虑到,如果您将使用最后一种情况,那么您必须更改语句

char *string = calloc(10, 1);

增加分配内存的大小,因为标签 default 下使用的字符串文字超过 10 个字符。

default: str = "DEFAULT_CASE";

关于c - 为什么字符串值没有在我的 C 代码中更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26637062/

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