簡體   English   中英

C中的變量地址

[英]Variables addresses in C

這是我的代碼:

#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自然會經歷相同的變化。 在您的第一段代碼中,您似乎不明白為什么someVarotherVar更改之后更改。 為了更明確地說明@dmp指出的內容,您已經告訴您程序(操作系統正在為您的程序管理內存), someVar將指向otherVar[0]otherVar[0]的值。 現在,當otherVar[0]更改時, someVar將會更改,因為這應該是指針的工作方式,當您請求指針所指向的值時,它會取消對指針的引用-並且您會注意到事態發生了變化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中的指針是按值傳遞的(指針的副本指向相同的位置)。 如果取消引用指針並更改指向的值,則調用者將看到更改。

快速指針課程應將其清除:

這條線上會發生什么? char * dd = aaa;

您已經創建了一個指向名為dd的字符分配的指針,並將其指向aaa存儲在的內存地址。

aaa的地址在堆棧上並且是靜態的(您是使用aaa [500]隱式創建的)。

現在,當您將數據放入aaa時,aaa在內存中的位置不會更改,只需將數據存儲在內存中的該位置即可。 當您嘗試打印aaa的“內容”時,您將獲得存儲在內存中該位置的字符。 當您將新數據復制到aaa中時,內存中的位置仍然保持不變,因此dd仍指向與aaa相同的內存空間。

如果沒有其他人清楚的話,我深表歉意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM