-1

这是我的代码:

#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 2dd

4

3 回答 3

2

如果您说出您正在尝试做的事情以便其他人能够正确看待您的代码,那可能会很棒。

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

指针“持有”指向内存的地址。如果你有ptr1指向内存块的A指针和指向ptr2的指针ptr1,如果你改变了ptr1,自然ptr2会经历同样的变化。在您的第一个代码块中,您似乎不明白为什么someVar更改后otherVar更改。为了更明确地指出@dmp 所指出的,您已经告诉您程序(操作系统正在为您的程序管理内存)someVar将指向otherVar[0]. 现在,当otherVar[0]更改时,someVar将会更改,因为指针应该是这样工作的,它被称为取消引用指针 - 当您请求指针指向的值时 - 您会注意到事情发生了变化 prptr2. 因此,请再次阅读有关指针的内容。

在您的第二个代码块中,我不知道您要完成什么,但无论它是什么,它都会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*))

这与您如何为 say 分配内存有关arr

  1. 也不要强制转换的返回值malloc。它将隐藏编译器可能捕获的许多错误!

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

希望下次你会做得更好!

更新

OP编辑后,现在的问题更清楚了,OP的问题是关于指针的。

dd的值发生变化,因为:

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

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

于 2012-09-09T18:32:08.990 回答
0

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

这条线上会发生什么?字符 *dd = aaa;

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

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

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

如果这不比其他人更清楚,我很抱歉......

于 2012-09-10T00:24:21.197 回答
0

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

于 2012-09-09T12:40:41.880 回答