更改char *数组中元素的地址? C

时间:2017-01-27 18:29:01

标签: c arrays

代码优先:

#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],但它不起作用。

你能指点我一些指示吗?

4 个答案:

答案 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;
}