(三)結構體指針、sizeof

(一)結構體指針定義linux

今天上班寫了一段測試代碼,結果在linux下編譯出現段錯誤,剛開始一直找不到緣由,後來找了度娘才搞懂了。我先貼出來第一次寫的代碼以及gcc編譯器下報的錯誤:函數

#include<stdio.h>
typedef struct 
{
	int a;
	char str;
	int b[5];
}St;
int main()
{
	St * Ds;
	Ds -> a = 5;
	Ds -> str = 'a';
	Ds -> b[5] = 2;
	printf("a = %d\nc = %c\nb = %d\n",Ds->a,Ds->str,Ds->b[5]);

	St Ea;
	Ea.a = 100;
	Ea.str = 'B';
	Ea.b[1] = 6;
	printf("a = %d\nc = %c\nb = %d\n",Ea.a,Ea.str,Ea.b[1]);
	return 0;
}

在linux gcc編譯器下編譯沒有報錯可是執行程序出現段錯誤,報錯以下:測試

咱們能夠看到程序沒法執行,而只定義St Ea結構體,執行下面的代碼沒有錯誤,當兩個一塊兒寫時就出錯。而之定義執行St* Ds結構體指針時執行程序時結果正確,可是一樣會報段錯誤。所以在這裏咱們知道了St* Ds這個結構體指針應該有問題。spa

後來查找資料總算知道了錯誤的地方,結構體指針在定義時必定要給它分配內存,不過不分配內存那這個指針指向的內存就是不肯定的,gcc編譯器不容許這種狀況出現,所以就會報段錯誤。修改程序以下所示,顯示結果正常,注意代碼中紅色是修改過的程序:指針

#include<stdio.h>
#include<stdlib.h>
typedef struct 
{
    int a;
    char str;
    int b[5];
}St;
int main()
{
    St * Ds;
    Ds = (St *) malloc (sizeof(St));
    Ds -> a = 5;
    Ds -> str = 'a';
    Ds -> b[5] = 2;
    printf("a = %d\nc = %c\nb = %d\n",Ds->a,Ds->str,Ds->b[5]);

    St Ea;
    Ea.a = 100;
    Ea.str = 'B';
    Ea.b[1] = 6;
    printf("a = %d\nc = %c\nb = %d\n",Ea.a,Ea.str,Ea.b[1]);
    return 0;
}

編譯程序,結果以下所示:code

咱們看到程序編譯執行都正常。blog

在這裏咱們總結一下:從此在寫從c代碼時遇到指針的定義,必定要注意給它分配內存,若是不分配內存便會出錯,在這裏咱們給結構體指針分配內存有兩種方法,分別以下:內存

一、使用malloc給指針分配內存編譯器

St* Ds;
Ds = (St*)malloc(sizeof(St));

二、使結構體指針指向一個已經定義了的機構體。以下所示io

St* Ds;
St Str_A;
Str_A.a = 0;
Ds = &Str_A;

2、sizeof

sizeof的做用是在c語言中計算數據類型或者表達式所佔的內存大小,注意它不是函數,sizeof是在程序編譯時執行,而不是在等到程序執行時才執行。要使用sizeof須要包含添加頭文件#include<stdilb.h>

計算結構體等變量使用sizeof時要注意給這個變量加小括號,不加就會出錯;sizeof(變量);

相關文章
相關標籤/搜索