【问题标题】:Assigning same values to 2 pointers, not equalising their references (pointers in C)将相同的值分配给 2 个指针,而不是使它们的引用相等(C 中的指针)
【发布时间】:2015-02-09 03:06:13
【问题描述】:
    printf("%p\n\n", element);       //0x1000020c0
    table->head->element = element;
    printf("%p\n\n", table->head->element);   //0x1000020c0

我有一个指向结构的指针,该结构指向另一个存储 char* 变量的结构。问题是发送到此方法的指针(char * 元素)在其他地方被修改,我不希望这些修改在 table->head->element 中受到影响。简单地说我想让它们的值相等,而不是引用。

我知道我们可以为 2 个指针分配相同的值,如下所示:*p1=*p2。但是,我不确定如何使用结构来做到这一点,我试过了:

    *(table->head->element) = *element;

但它不起作用。

我希望我能澄清我的问题。

【问题讨论】:

  • *table->head->element = *element;?
  • 没有工作我的意思是我得到了 EXC_BAD_ACCESS(code=1;...)
  • 您似乎没有为至少一个指针分配空间
  • 看来是对的。刚刚通过调试器检查。它不为结构头中的元素分配内存。但是,我有这一行 table->head = (struct node*)malloc(sizeof(struct node)); ,我虽然应该分配内存。
  • 如果你有一个带有指针的结构,为结构分配空间会为指针本身分配空间,但不会为指向的数据分配空间。毕竟编译器不知道你什么时候要分配空间。

标签: c pointers struct char assign


【解决方案1】:

如果您希望通过副本而不是简单地引用指向的字符串,则需要将 strcpy() 到一些新内存中。例如

int len = strlen(element);
table->head->element = malloc(len+1); // +1 for string-terminating null
strcpy(table->head->element, element);

(或使用 strdup() 作为单行解决方案,正如 R Sahu 的回复中所指出的那样)。

【讨论】:

  • 这行得通,但我不想使用额外的应对措施,因为我们可以用指针来做到这一点
  • @Fiz,你不能两者兼得——保持指针并期望值保持独立。
  • @rSahu 你能详细说明你的意思吗?
  • 如果你有十个指针 1..10 都指向同一个内存,并且一些代码通过指针 1 改变了内存,所有的指针都会看到变化。他们都指向同一个东西。你改变了东西,他们仍然都指向现在改变的东西。如果你现在想要不同的指针指向不同的东西,那么你必须创建/分配一个新的东西。
  • @GrahamPerks 这正是我想要避免的
【解决方案2】:

在@GrahamPerks 的回答中回应 OP 的 cmets。

这行得通,但我不想使用额外的应对,因为我们可以用指针来做到这一点

假设element 使用的内存如下所示:

element +---------+       +---+---+---+---+---+---+---+---+------+
        |  ptr1   |  ->   | a |   | s | t | r | i | n | g | '\0' |
        +---------+       +---+---+---+---+---+---+---+---+------+

如果你使用:

table->head->element = element;

table->head->element 的值为ptr1

如果一段时间后,您继续将ptr1 的内容更改为element,例如使用:

fscanf(file, "%s", element);

你可能会得到:

element +---------+       +---+---+---+---+---+---+---+---+---+---+------+
        |  ptr1   |  ->   | n | e | w |   | s | t | r | i | n | g | '\0' |
        +---------+       +---+---+---+---+---+---+---+---+---+---+------+

此时,您从table->head->element 看到的字符串是"new string",而不是"a string"

当您不复制element 的内容而只复制element 的指针值时会发生这种情况。

如果您希望table->head->element 的值保持"a string"element 的值发生变化,则必须使用复制element 的内容

int len = strlen(element);
table->head->element = malloc(len+1);
strcpy(table->head->element, element);

或者,如果您的编译器支持strdup,则使用

table->head->element = strdup(element);

【讨论】:

  • 天啊,感谢 strdup() 提醒!离开C太久了。 malloc 和 strcpy,我真傻!
  • @GrahamPerks malloc 和 strcpy 是标准 C 函数,而 strdup 不是,所以你的代码很好!
猜你喜欢
  • 2015-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
相关资源
最近更新 更多