修改函数中的指针
Modifying a pointer in a function
我制作了一个允许通过键盘输入字符串的函数。该函数有两个参数:字符串的最大可能长度和指向 char 的指针。函数内部发生的事情是声明一个字符数组,其中元素的数量与最大长度一样多,然后用户给出的字符串被临时存储在该数组中。字符串的获取完成后,我使用 calloc 函数分配恰到好处的内存量,以将相同的字符串存储在指向已作为参数传递的 char 的指针中。
int main(void)
{
char* test;
stringInput(test, 10);
printf("%s", test);
return 0;
}
void stringInput(char* string, int maxStringLength)
{
char tempString[maxStringLength];
//STRING GETS PROPERLY STORED IN tempString
string = (char*)calloc(strlen(tempString)+ 1, sizeof(char));
strcpy(string, tempString);
return;
}
这种工作,意味着如果我尝试在此函数命中 return 之前打印 "string",程序实际上会显示它应该显示的内容。但是,当我尝试在主函数中打印 "test" 时,它没有打印任何内容,这意味着 stringInput 没有修改传递给它的指针。我通过在函数调用之前、calloc 行之后以及函数调用之后再次打印 "test" 的地址进一步证实了这一点,这表明它在 calloc 之后发生了变化,但是当功能结束。
我该如何解决这个问题?
这里的问题是,test
本身是按值传递的,它存储在string
中,您对string
所做的任何更改都不会反映回[=12] =].
如果你想修改test
本身,你需要传递一个指向test
的指针。
类似
stringInput(&test, 10);
和
void stringInput(char** string, int maxStringLength)
{
char tempString[maxStringLength];
//STRING GETS PROPERLY STORED IN tempString
*string = calloc(strlen(tempString)+ 1, sizeof(char)); // no need to cast
if (!string) {
printf("error in calloc!!\n");
return;
}
strcpy(*string, tempString);
return;
}
当您将 calloc
转换为 string
时,您只修改了 string
的本地副本,而不是 test
变量。您可能想要做的是传入并操作指向您的 char 指针的指针。
您可以将函数签名更改为:
void stringInput(char **string_p, int maxStringLength)
然后,将您对 string
的用法替换为 *string
。
最后,您将调用您的函数,传递一个指向 test
的指针,而不是它的值:
stringInput(&test, 10);
这是一种处理方式,但您也可以 return 一个指针,具体取决于您希望如何构建事物。
我制作了一个允许通过键盘输入字符串的函数。该函数有两个参数:字符串的最大可能长度和指向 char 的指针。函数内部发生的事情是声明一个字符数组,其中元素的数量与最大长度一样多,然后用户给出的字符串被临时存储在该数组中。字符串的获取完成后,我使用 calloc 函数分配恰到好处的内存量,以将相同的字符串存储在指向已作为参数传递的 char 的指针中。
int main(void)
{
char* test;
stringInput(test, 10);
printf("%s", test);
return 0;
}
void stringInput(char* string, int maxStringLength)
{
char tempString[maxStringLength];
//STRING GETS PROPERLY STORED IN tempString
string = (char*)calloc(strlen(tempString)+ 1, sizeof(char));
strcpy(string, tempString);
return;
}
这种工作,意味着如果我尝试在此函数命中 return 之前打印 "string",程序实际上会显示它应该显示的内容。但是,当我尝试在主函数中打印 "test" 时,它没有打印任何内容,这意味着 stringInput 没有修改传递给它的指针。我通过在函数调用之前、calloc 行之后以及函数调用之后再次打印 "test" 的地址进一步证实了这一点,这表明它在 calloc 之后发生了变化,但是当功能结束。 我该如何解决这个问题?
这里的问题是,test
本身是按值传递的,它存储在string
中,您对string
所做的任何更改都不会反映回[=12] =].
如果你想修改test
本身,你需要传递一个指向test
的指针。
类似
stringInput(&test, 10);
和
void stringInput(char** string, int maxStringLength)
{
char tempString[maxStringLength];
//STRING GETS PROPERLY STORED IN tempString
*string = calloc(strlen(tempString)+ 1, sizeof(char)); // no need to cast
if (!string) {
printf("error in calloc!!\n");
return;
}
strcpy(*string, tempString);
return;
}
当您将 calloc
转换为 string
时,您只修改了 string
的本地副本,而不是 test
变量。您可能想要做的是传入并操作指向您的 char 指针的指针。
您可以将函数签名更改为:
void stringInput(char **string_p, int maxStringLength)
然后,将您对 string
的用法替换为 *string
。
最后,您将调用您的函数,传递一个指向 test
的指针,而不是它的值:
stringInput(&test, 10);
这是一种处理方式,但您也可以 return 一个指针,具体取决于您希望如何构建事物。