C中的变量地址

时间:2012-09-09 12:36:07

标签: c windows winapi

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
    char *dd,aaa[500];
    strcpy(aaa,"test 1");
    dd=aaa;
    printf("1. %s\n",dd);
    strcpy(aaa,"test 2");
    printf("2. %s\n",dd);


system("pause");
return 0;
}

当我将aaa变量更改为test 2字符串时,dd也会发生变化,为什么?

3 个答案:

答案 0 :(得分:2)

如果你说出你想要做的事情,以便其他人能够对你的代码进行透视,那可能会很棒。

现在你似乎还没有完全理解指针是如何工作的。由于您的代码不是很容易阅读,因此答案是通用的。

指针'保持'地址到内存。如果指针ptr1指向内存块A而指针ptr2指向ptr1,如果更改ptr1,则自然会ptr2同样的变化。在您的第一个代码块中,您似乎无法理解someVar更改后otherVar更改的原因。为了更清楚地说明@dmp指出的内容,您已告诉您程序(操作系统正在管理您的程序的内存),someVar将指向otherVar[0]中保存的值。现在当otherVar[0]发生变化时,someVar会发生变化,因为这就是指针应该起作用的方式,当你请求指针指向的值时,它被调用取消引用一个指针 - 你将会注意事情改变了pr ptr2。所以,请再次重读指针。

在你的第二段代码中,我不知道你想要完成什么,但无论它是什么,它都会SEGFAULT。这是因为再次,您还没有理解指针,数组和动态内存分配如何工作之间的关系。例如,在splittext函数中,您有这一行:

wchar_t *arr[2],*loc = wcsstr(stri, del), buf[DEFAULT_BUFLEN];

就在那里:当你没有为它分配内存时,你告诉操作系统检查*arr的第3个单元格的值。此外,在分配内存时,请记住:

  1. 如果你想为char分配内存来获取一个字符串,你的指针必须是指向char的指针,如下所示:
  2. char* my_string = malloc( 256*sizeof(char))

    现在,您希望将内存分配给指向类型为FILE*的变量的指针。 如果你写FILE** my_files = malloc( NUMBER_OF_FILES*sizeof(FILE)),它会让你陷入困境。而是写:

    FILE** my_files = malloc( NUMBER_OF_FILES*sizeof(FILE*))

    这是关于如何为arr分配内存。

    1. 也不要转换malloc的返回值。它将隐藏编译器可能捕获的许多错误!
    2. 总而言之,首先尝试学习指针,然后再进行指针,数组和内存分配的一些高级用法;第二,你不能把错误的代码(你知道它不正确,或者它不编译或只是崩溃)并告诉其他人:“嘿看看那个变量,这就是我的问题所在。”尝试对问题进行更多研究,尝试学习哪些工具可以提供帮助 - 在这种情况下是调试器 - 这将提高您的问题的质量。第三个也是最后一个,如果英语不是你的第一语言,你可以提及它,其他人愿意帮助重新构建你的问题。

      希望下次你会做得更好!

      <强>更新

      在OP编辑之后,问题现在更加清晰,OP的问题在于指针。

      dd的价值变化是因为:

      aaa是这样的指针:char aaa[500]相当于char* aaa = malloc(500*sizeof(char))。现在当你dd=aaa时,你告诉编译器dd将指向与aaa相同的内存地址。因此,每次修改aaa dd都会被修改,因为它们指向内存中的相同内容。

      如果不清楚,请尝试重新读取指针的定义。

答案 1 :(得分:0)

你问的不清楚,但是,C中的指针是按值传递的(指针的副本指向同一位置)。如果取消引用指针并更改指向的值,则调用者将看到更改。

答案 2 :(得分:0)

快速指针课程应该清除它:

这条线路会发生什么? char * dd = aaa;

您已经创建了一个指向名为dd的字符分配的指针,并将其指向存储aaa的内存地址。

aaa的地址在堆栈上并且是静态的(你用aaa [500]隐式创建了它。)

现在,当你将数据放入aaa时,aaa在内存中的位置不会改变,只是存储在内存中该位置的数据。当您尝试打印出aaa的“内容”时,您将获得存储在该内存中的字符。将新数据复制到aaa时,内存中的位置仍然保持不变,因此dd仍指向与aaa相同的内存空间。

如果这比其他任何人都更清楚,我表示道歉......