如果您说出您正在尝试做的事情以便其他人能够正确看待您的代码,那可能会很棒。
现在你似乎还没有很好地理解指针是如何工作的。由于您的代码不是很容易阅读,因此答案将是一般性的。
指针“持有”指向内存的地址。如果你有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
在您尚未为其分配内存的情况下检查第三个单元格的值。此外,在分配内存时,请记住:
- 如果要分配内存
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
。
- 也不要强制转换的返回值
malloc
。它将隐藏编译器可能捕获的许多错误!
总而言之,首先尝试了解指针,然后再进一步了解指针、数组和内存分配的高级用法;其次,您不能输入不正确的代码(您会知道它不正确,要么它不编译,要么只是崩溃)并告诉其他人:“嘿,看看那个变量,这就是我的问题所在。” 尝试对问题进行更多研究,尝试了解哪些工具可以提供帮助——在这种情况下是调试器——这将提高你的问题的质量。第三也是最后一点,如果英语不是您的第一语言,您可以提及它,其他人将愿意协助您重新提出问题。
希望下次你会做得更好!
更新
OP编辑后,现在的问题更清楚了,OP的问题是关于指针的。
dd
的值发生变化,因为:
aaa
是这样的指针:char aaa[500]
相当于char* aaa = malloc(500*sizeof(char))
. 现在,当dd=aaa
您告诉编译器dd
将指向相同的内存地址时aaa
。因此,每次修改aaa
dd
都会被修改,因为它们指向内存中的相同内容。
如果不清楚,请尝试重新阅读指针的定义。