簡體   English   中英

C'中結構的不同行為

[英]Different behaviour of struct in C'

我開始學習C,挺好玩的。 但是當我嘗試使用struct時,我已經到了關鍵點。 下面是我創建的程序,我注意到struct的行為因創建方式而異。

當我運行下面的程序時,我的 output 令人驚訝。 Output:

1. 1 0.000000 (some strange chars)
2. 0 0.000000 (null)

首先就像你可以看到 1 的 output 一樣,2 是不同的,即使它與相同的struct相關。 第二個數字 3 根本沒有打印。

我想知道這是為什么? 我在 stackoverflow 上找到了一些關於c struct的解釋,但這篇文章沒有涉及這個問題。 我想知道這是否是因為編譯器? 或者這是我必須了解的 C 的正常功能? 還是我什至考慮過?

#include <stdio.h>

struct s1 {
  int int1;
  double double1;
  char *string;
} strc;

typedef struct {
  int int1;
  double double1;
  char *string;
} DStruct;

int main() {
  struct s1 defqu;
  DStruct defqu2;

  printf("1. %d %f %s\n", defqu.int1, defqu.double1, defqu.string);
  printf("2. %d %f %s\n", strc.int1, strc.double1, strc.string);
  printf("3. %d %f %s\n", defqu2.int1, defqu2.double1, defqu2.string);
  
  return 0;
}

您從未初始化您創建的實例,因此它包含“垃圾”。 因此,您可以期待“意外行為”:)

將其更改為:


struct s1 {
  int int1;
  double double1;
  char *string;
} strc = {0};

typedef struct {
  int int1;
  double double1;
  char *string;
} DStruct;

int main() {
  struct s1 defqu = {0};
  DStruct defqu2 = {0};

  ...

語法= { 0 }將結構中的所有值初始化為 0。來自 C99 標准:

如果大括號括起來的列表中的初始值設定項少於聚合的元素或成員,或者用於初始化已知大小數組的字符串文字中的字符少於數組中的元素,則聚合的其余部分應與具有 static 存儲持續時間的對象一樣被隱式初始化。

這樣會更好,但仍不完美。 數字將全部初始化為 0,字符串指針(更准確地說是char * )將初始化為 NULL。

現代 libc 實現將優雅地處理您傳遞給%s的 NULL 指針,但這實際上也是未定義的行為。

strc是一個全局變量。 它保證(按 C 標准)初始化為零。 所以strc的所有成員也將被初始化為零(包括字符串指針)。 當您嘗試在第二個 printf ( %s ) 中打印string時,您會調用未定義的行為(取消引用 null 指針)。 當取消引用 NULL 指針時,程序很可能會崩潰/終止,但這不是標准所保證的。 因為,你知道,這是未定義的行為!

defqudefqu2main function 中的局部變量。在 C 中,局部變量永遠不會自動初始化。所以它們有一些垃圾值,不能像strc那樣保證為零。 因此, string指針指向某個隨機地址 memory,而第一個 printf 最有可能在該隨機 memory 位置打印字符。 您沒有從第三個printf中看到任何 output,因為如上所述,由於 null 取消引用,程序在第二個printf崩潰/退出。 將這個printf移到最后,你也會看到 defqu2 的defqu2 ,但你永遠無法確定(因為,未定義的行為!)

暫無
暫無

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

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