(三)結構體指針、sizeof


(一)結構體指針定義

今天上班寫了一段測試代碼,結果在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這個結構體指針應該有問題。

后來查找資料總算知道了錯誤的地方,結構體指針在定義時一定要給它分配內存,不過不分配內存那這個指針指向的內存就是不確定的,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;
}

編譯程序,結果如下所示:

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

在這里我們總結一下:今后在寫從c代碼時遇到指針的定義,一定要注意給它分配內存,如果不分配內存便會出錯,在這里我們給結構體指針分配內存有兩種方法,分別如下:

1、使用malloc給指針分配內存

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

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

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

二、sizeof

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM