[英]Why string value is not being updated in my C code?
我不明白我的代碼有什么問題。 我為字符串分配了空間,並通過引用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
分配的內存
free( str );
還應考慮到,如果要使用最后一種情況,則必須更改語句
char * string = calloc(10,1);
增加了分配的內存的大小,因為在標簽default
使用的字符串文字包含10個以上的字符。
default: str = "DEFAULT_CASE";
您將函數中的本地指針str
指向字符串文字
str = "ADD";
這既不會復制字符串,也不會更新傳遞給函數的字符串。
您必須將字符串復制到str
指向的數組
strcpy( str , "ADD" ) ;
由於您為str
分配了十個字符
char *string = calloc(10, 1);
您不應復制超過9個字符+空終止符。
這是因為“ whatever”是char *類型,因此您可以在函數內部更改指針,而不是字符串本身。 建議將取決於您實際上要執行的操作:重寫字符串本身? 或將函數外部的指針更改為僅在函數內部存在的字符串? 后者當然是行不通的...
弗拉德的答案是迄今為止最好的。
請記住,有一種更好的方法可以將枚舉值(實際上是任何值)轉換為字符串。
您可以利用C預處理程序。
#define STRINGIFY(VAL) "" # VAL
const char* addStr = STRINGIFY(ADD);
它將VAL連接到一個空字符串,從而創建一個包含VAL的字符串。
嘗試這個:
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;
}
我希望你能得到答案。 您應該找出原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.