我无法理解我的代码有什么问题。我为字符串分配了空间,并通过引用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;
}
答案 0 :(得分:2)
在函数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";
答案 1 :(得分:2)
将函数中的本地指针str
指向字符串文字
str = "ADD";
这也不会复制字符串或更新传递给函数的字符串。
您必须将字符串复制到str
strcpy( str , "ADD" ) ;
因为您为str
char *string = calloc(10, 1);
您不应复制超过九个字符+空终止字符。
答案 2 :(得分:1)
那是因为“what”是char *类型,所以你改变了函数内部的指针,而不是字符串本身。建议取决于你实际要做的事情:重写字符串本身?或者将函数外部的指针更改为仅存在于函数内部的字符串?当然,后者无法发挥作用......
答案 3 :(得分:0)
请记住,有一种更好的方法可以将枚举值(实际上是任何值)转换为字符串。
您可以利用C预处理器。
#define STRINGIFY(VAL) "" # VAL
const char* addStr = STRINGIFY(ADD);
它将VAL连接到一个空字符串,从而创建一个包含VAL的字符串。
答案 4 :(得分:-1)
试试这个:
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;
}
我希望你得到答案。你应该找出这个有效的原因。