c語言-指針-分配內存和賦值須要注意的

          每次使用指針都會遇到大大小小的問題,每次都要翻開資料琢磨錯在哪,尋根究底仍是對指針仍是沒有徹底掌握。本文爲了加深映像,避免之後犯相似的錯誤,特意作了一些實驗。數組

1.字符串指針變量賦值函數

#include<stdio.h>
int main(){
        char *b="azzzxxxddd";
        b="azzzxxxdddccccc";
       printf("%s", b);
        system("pause");
        return 0;
}指針

結果:沒有報錯,b賦值成功,正常輸出。內存

緣由分析:這裏爲何沒有內存溢出呢,緣由是初始化b指針的時候將b指向了字符串常量"azzzxxxddd"的首地址,再次賦值"azzzxxxdddccccc"時,又將b指向了字符串常量"azzzxxxddd"的首地址,不管字符串長度怎麼增長都不會內存溢出,可見初始化b的時候並無分配內存,只是作了指向動做。字符串


2.字符串指針變量分配動態內存和賦值string

2.1
io

#include<stdio.h>
#include<string.h>

int main(){
        char *b=(char*) malloc(5*sizeof(char));
        strcpy(b, "abcdefghids");
        printf("%s", b);
       system("pause");
        return 0;
}變量

結果:沒有報錯,b賦值成功,正常輸出。總結

緣由分析:這裏爲何沒有內存溢出呢,緣由是雖然b指針指向了一段擁有5字符內存空間,可是剛好順序下來的空間沒有填滿,因此後面的字符能裝下。如今把這個字符串擴充至5000字節賦值再次運行,結果內存溢出報錯。di


 2.2

int main(){
       
        char *a="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        char *b=(char*) malloc(5*sizeof(char));
         b = a;
         printf("%s", b);
        system("pause");
        return 0;
}

結果:沒有報錯,b賦值成功,正常輸出。

緣由分析:這裏爲何沒有內存溢出呢,緣由是雖然b指針指向了一段擁有5字符內存空間,可是第二次賦值指針b指向了a指針所指向的地址,原來給b分配的內存空間沒有使用。如今把a指向的字符串擴充至5000字節再次運行,依然沒有報錯,再次證實了這一點,也說明了直接賦值和使用strcpy函數賦值的區別。


2.3

int main(){
       
        char a[20]="aaaaaaaaaaaaaaaaa";
        char *b=(char*) malloc(5*sizeof(char));
        b = &a;
        printf("%s", b);
       system("pause");
        return 0;
}

結果:沒有報錯,b賦值成功,正常輸出。

緣由分析:道理同2.2,只是把字符串常量放入了數組,再另b指向數組a的首元素地址。


2.4

int main(){
        char a[20]="aaaaaaaaaaaaaaaaa";
        char *b=(char*) malloc(5*sizeof(char));
        strcpy(b,  a);
        printf("%s", b);
       system("pause");
        return 0;
}

結果:沒有報錯,b賦值成功,正常輸出。

緣由分析:道理同2.1,把數組a改成5000容量,內放5000字符會內存溢出報錯。


總結 :指針變量初始化賦值或直接賦值不會分配內存空間,賦值也只是改變了指針的指向,通過malloc動態分配內存後指針會指向一段連續的未被使用的內存空間,若是此時再使用直接賦值,指針就會指向新賦值的字符串首地址而放棄指向原來的分配空間,若是是用strcpy函數,它會將第二個參數填至指針指向的新內存空間,這是須要注意的。

相關文章
相關標籤/搜索