使用此功能我真的很难。
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);
答案 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;
}