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

时间:2014-10-29 17:33:17

标签: c

我无法理解我的代码有什么问题。我为字符串分配了空间,并通过引用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;
}

5 个答案:

答案 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;
}

我希望你得到答案。你应该找出这个有效的原因。

相关问题