在此函数中使用未初始化

时间:2014-04-23 13:36:46

标签: c

使用此功能我真的很难。

void GetBaseDeclarationLabel(char *strings_label_table1[], char *strings_mneumonic_table1[],
         char *strings_operand_table1[], int hex_address_table1[], char *base_label)
{
    int i = 0;
    int cmp_str2 = 0;
    //char label[20] = {0}; 
    //int k = 0; 
    //printf(" i is %s \n", strings_label_table1[1]); 
    for(i = 0; i < 503; i++)
    {
        if(strings_mneumonic_table1[i] != NULL)
        {
            cmp_str2 = strcmp(strings_mneumonic_table1[i], "BASE");
            if(cmp_str2 == 0)
            {
                //printf(" ??please?? \n");
                //printf(" hex_address_table1[i] is %x \n", hex_address_table1[i]);
                //strcpy(label, strings_operand_table1[i]);
                base_label = malloc(strlen(strings_operand_table1[i])+1);
                strcpy(base_label, strings_operand_table1[i]);
                //base_label = strings_operand_table1[i]; 
                break;
            }
        }

    }
    //return label;
} 

这是我的初始变量声明。我把它设为NULL的原因是因为我的警告标志抱怨它没有初始化,当我没有这样做时我遇到了分段错误。既然我已经这样做了,我就无法让base_label改变。我已经尝试了通常的=方法,只是为了它的地狱我尝试了malloc然后strcpy方法。这两种方法都没有改变价值。

char *base_label = NULL;  

这就是我调用函数的方式。

GetBaseDeclarationLabel(strings_label_table1, strings_mneumonic_table1,
     strings_operand_table1, hex_address_table1, base_label);

2 个答案:

答案 0 :(得分:8)

如果您的函数应分配缓冲区并返回该缓冲区,则需要将函数签名更改为

void GetBaseDeclarationLabel(char *strings_label_table1[], char *strings_mneumonic_table1[],
     char *strings_operand_table1[], int hex_address_table1[], char **base_label);

然后你会

*base_label = malloc(strlen(strings_operand_table1[i])+1);
strcpy(*base_label, strings_operand_table1[i]);

来电者将更改为

char *base_label = NULL;
GetBaseDeclarationLabel(strings_label_table1, strings_mneumonic_table1, strings_operand_table1,
                        hex_address_table1, &base_label);

答案 1 :(得分:3)

因为在C中,参数是按值传递的,所以如果要更改函数中变量的值,则需要将该变量的地址传递给该函数。因此,如果要更改函数中指针的值,则需要传递该指针的地址,a.k.a。双指针。

例如,

int v;

foo (&v); /* `v` will equals 42 after this */


void foo (int *v) {
    *v = 42;
}