如果我有char* str;
我如何编写一个接受str
并且可以对str
进行更改的函数,以便在函数返回后更改仍然存在?
我所拥有的是:
char *str = (char *) malloc(10);
sprintf(str, "%s", "123456789");
//str points to 1
move_ptr(&str);
//str points to 2
void move_ptr(char** str)
{
*str++;
}
有更好的方法吗?
答案 0 :(得分:14)
只需通过指针访问数据:
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
void change_string(char *str)
{
size_t i;
/* As an example, make it all upper case. */
for(i = 0; str[i]; ++i)
str[i] = toupper(str[i]);
}
int main(void)
{
char buffer[32];
char *str = buffer;
strcpy(str, "test string");
change_string(str);
printf("it's now %s\n", str);
return EXIT_SUCCESS;
}
想一想,您会注意到标准strcpy()
函数正是您描述的类别。这是C中非常常见的操作。
更新:问题已被重写,现在似乎更多的是更改指针本身,而不是数据。也许这就是一直以来的意思,但我不明白。
问题中的解决方案很好,但我个人觉得如果可能的话,使用返回值会更方便:
char * change_pointer(char *str)
{
return str + 1;
}
int main(void)
{
char *str = "test string";
printf("now '%s'\n", str);
str = change_pointer(str);
printf("now '%s'\n", str);
return EXIT_SUCCESS;
}
指针当然也可以是const
- 声明,如果不需要更改缓冲文本,应该。
答案 1 :(得分:2)
问题已更改
如果指针指向只读数据,则无法更改指向的内容。
当写一个
char *data = "forty two";
“四十二”是只读数据;并且您无法直接或通过函数调用更改指针data
指向的内容。
要从文字常量初始化'字符串',而不是指定文字常量的指针,请将字符复制到数组
char data[] = "forty two";
现在数据是一个包含10个字符的数组(字母和空格为9,NUL终结符为1),您可以随意更改。
答案 2 :(得分:0)
你的例子可能过于简化了,但以防万一......小心这样做,因为你要泄漏内存。在函数调用之后,您不再有指向您所分配的原始内存(的一部分)的指针。
如 unwind 所述,返回新指针可能是更好的选择。虽然它实现了相同的目标,但它更明显的是你需要保持原始指针以释放内存。反驳的论点是,它给人的印象是,一旦你有了返回值就可以释放原始指针,这是你无法做到的,因为它们都指向同一个内存块中的(不同位置)。