c - C中的变量地址

标签 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;
}

当我通过 test 2 字符串更改 aaa 变量时,dd 也会更改,为什么?

最佳答案

如果您说出您正在尝试做什么,以便其他人正确理解您的代码,那就太好了。

现在你似乎还没有很好地理解指针是如何工作的。由于您的代码不太容易阅读,因此答案很笼统。

指针“保存”内存地址。如果你有指针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第三个单元格的值当你还没有为其分配内存时。另外,在分配内存时,请记住:

  1. 如果你想为 char 分配内存要获取字符串,您的指针必须是指向 char 的指针像这样:

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 的返回值。它将隐藏编译器可能捕获的许多错误!

总而言之,首先尝试了解指针,然后再继续了解指针、数组和内存分配的高级用法;其次,你不能输入不正确的代码(你会知道它是不正确的,要么无法编译,要么只是崩溃)并告诉其他人:“嘿看看那个变量,这就是我的问题所在。”尝试对问题进行更多研究,尝试了解哪些工具可以提供帮助(在本例中为调试器),这将提高问题的质量。第三也是最后一点,如果英语不是您的母语,您可以提及它,其他人将愿意协助重新表述您的问题。

希望你下次能做得更好!

更新

经过OP编辑后,现在的问题更加清晰,OP的问题是关于指针的。

dd的值发生变化,因为:

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

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

关于c - C中的变量地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12339105/

相关文章:

c - itoa 实现崩溃?

c - 在全屏模式下打开 Windows 控制台程序

c - C 中查找数组中最小数字的算法

c - 如何从头文件中获取未使用的变量警告?

windows - 如何使用 PowerShell 提供程序的 unless 子句获取 Puppet exec 资源以确定是否已禁用 Chocolatey 源?

windows - 如何检测 COM 对象实现的所有接口(interface)?

c++ - 如何跟踪键盘输入并绕过 SendInput

c++ - 优化后的 VS2008 中 "<<"和 "++"的运算符优先级

winapi - Win32 API 提供的数据结构?

c - 如何检查用户输入是否是某个字符