我剛開始學習結構,我正在嘗試將它們與指標一起使用,以獲得更好的 C 編程技能。現在,在練習中,我必須預加載可以加載到程式中的 4 名員工中的 2 名(特別是 0 和 1 的插槽db1[4])。現在,在預加載時,程式能夠加載第一個員工(姓名、性別和薪水),但是在嘗試加載第二個員工時,我遇到了分段錯誤(第 27 行)。
我的教授告訴我,通過用 獲取結構定義的大小sizeof(db_mold),理論上,我可以通過乘以n結果sizeof(db_mold)并將其添加到指標來逐個插槽跳轉。
sizeof(db_mold)似乎是 28,但在使用公式(sizeof(db_mold)*n)并將其添加到 后db1p,我得到了分段錯誤。
現在,正如我在另一個問題中所讀到的,結構可以有填充,但我不明白這些填充放在哪里,它們有多大。另外,那個問題中沒有提到的事情是,如果我有一個 AoSwAaNA(帶有陣列和非陣列的結構陣列)會發生什么。
這是我的代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char nombre[20];
char sexo;
unsigned int sueldo;
}db_mold;
void preload(db_mold *, int);
void user_load(db_mold *, int);
int main(){
db_mold db1[4] = {0};
preload(&db1[0], (sizeof(db_mold)));
user_load(&db1[0], (sizeof(db_mold)));
}
void preload(db_mold *db1p, int sizedb){
strcpy((db1p (sizedb*0))->nombre, "Franco");
(db1p (sizedb*0))->sexo = 'M';
(db1p (sizedb*0))->sueldo = 20000;
strcpy((db1p (sizedb*1))->nombre, "Romina");
(db1p (sizedb*1))->sexo = 'F';
(db1p (sizedb*1))->sueldo = 23000;
}
void user_load(db_mold *db1p, int sizedb){
for (int i = 2; i < 4; i ){
char tmp[20] = {0};
printf("Ingrese el nombre del empleado %d: ", i);
fgets(tmp, sizeof tmp, stdin);
strcpy(tmp, (db1p (sizedb*i))->nombre);
//fgets((db1p (sizedb*i))->nombre, sizeof *((db1p (sizedb*i))->nombre), stdin);
printf("Ingrese el Sexo (M o F) del empleado %d: ", i);
(db1p (sizedb*i))->sexo = getchar();
getchar();
printf("Ingrese el salaio del empleado %d: ", i);
scanf("%u", &(db1p (sizedb*i))->sueldo);
printf("Empleado Cargado!\n");
}
}
注意:它還沒有完成
uj5u.com熱心網友回復:
要么你的教授弄錯了,要么你誤解了。您不需要乘以結構的大小,因為指標演算法會自動執行此操作。如果你也這樣做,你的所有索引都會乘以兩次,這會訪問陣列外部,導致未定義的行為。
char*如果在進行算術之前將指標轉換為,則只需要這樣做。
填充不是問題,因為sizeof包括填充。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/487149.html
