代码优先:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void test (char* word)
{
char y[20] = "hlajwoma";
word = &y;
}
int main()
{
char* words[3] = {NULL};
test(words[1]);
words[0] = "LOL0";
words[1] = "LOL1";
words[2] = "LOL2";
printf("%s\n%s\n%s", words[0], words[1], words[2]);
return 0;
}
所以我想在这里做的是,你可以看到我有一个叫做*字的char *。该数组存储元素的内存地址。我选择要编辑的单词[1],但它不起作用。
你能指点我一些指示吗?
答案 0 :(得分:1)
你遇到的一个问题是,参数是按值传递 ,基本上意味着它们被复制到函数中的局部变量中。更改副本当然不会更改原始副本,并且局部变量超出范围并在函数返回后不再存在。您通常使用按引用传递来解决它,这在C中不存在但可以使用指针进行模拟。因此,您需要将指针作为参数传递给指针,并在函数中使用解除引用来更改值。
然而 引导我们回到整个“局部变量”的事物,以及一旦它们超出范围它们将如何停止存在。由于您希望使指针指向本地数组y
,一旦函数返回指针将不再有效,并且使用指针将导致未定义的行为。
实际问题是你在执行任务之前调用你的函数进行“修改” 。一旦你解决了上述问题,你应该改变你做事的顺序。
答案 1 :(得分:1)
在函数调用之后,您将重新分配到words[0]
。所以,无论它应该修改什么,都不会起作用。
然而,你的修改&#34;从一开始就不正确。
使用此声明
word = &y;
您正在修改word
功能的本地指针test()
。如果要修改内容,可以使用strcpy()
。但是,传递给test()
的是字符串文字的地址,无法修改。
为了修改指针,必须将指针传递给指针。但是您无法为其分配局部变量的地址(这会导致未定义的行为)。
您可能想要做的事情是:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void test (char **word)
{
char *y = "hlajwoma";
*word = y;
}
int main(void)
{
char* words[3] = {NULL};
words[0] = "LOL0";
words[1] = "LOL1";
words[2] = "LOL2";
test(&words[0]);
printf("%s\n%s\n%s", words[0], words[1], words[2]);
return 0;
}
这个
char *y = "hlajwoma";
将字符串文字"hlajwoma"
的地址(静态存储时间)分配给y
。
这完全不同于:
char y[] = "hlajwoma";
将字符串文字复制到数组y
中。因此,数组y
是函数test()
的本地。
答案 2 :(得分:0)
words[1] = "LOL1";
是指向常量字符串的char指针。
答案 3 :(得分:0)
如果我正确理解您的问题,您希望您的函数能够修改数组words
。换句话说,我认为您希望输出如下:
LOL0
hlajwoma
LOL
如果是这种情况,那么你想要的是你的函数接收一个指向数组的指针,并使用这个指针使第二个元素指向另一个字符串。
但是,您将遇到第二个问题,即尝试使main
中的指针指向仅在test()
的生命周期内存在的字符串。也就是说,当你有这样的代码时:
void test (char** word)
{
char y[20] = "hlajwoma";
*word = y;
}
变量y
由调用test()
时动态内存区域中的程序创建。完成运行后,该字符串不再存在。如果您将其地址存储在任何指针中,该指针现在无效。您可以简单地指向一个字符串文字,它在程序运行的整个过程中都存在。
您的代码的另一个问题是您先调用test()
然后修改数组。即使test()
完美无缺,也无法完成任务。所以我们也改变了它的顺序。
所以你可以这样做:
#include <stdio.h>
#include <stdlib.h>
void test (char** word)
{
word = "hlajwoma";
}
int main(void)
{
char* words[3] = {NULL};
words[0] = "LOL0";
words[1] = "LOL1";
words[2] = "LOL2";
test(&words[1]);
printf("%s\n%s\n%s", words[0], words[1], words[2]);
return 0;
}