#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
#include "ctype.h"
#include <string.h>
typedef struct t1 {
int val;
} TT;
typedef struct t2 {
TT *va;
} qq;
int cl(qq *w) {
TT *tmp;
tmp = w->va;
printf("tmp1 = %d\n", tmp[0].val);
tmp[0].val = 2;
printf("tmp2 = %d\n", tmp[0].val);
return 0;
}
int main() {
qq *w;
int len = sizeof(qq) + 5 * sizeof(TT);
printf("1");
w = (qq*)malloc(len);
//memset(w, 0x00, len);
printf("2");
w->va[0].val = 5;
printf("3");
printf("w1 = %d\n", w->va[0].val);
printf("4");
cl(w);
printf("w2 = %d\n", w->va[0].val);
return 0;
}
把memset加上,就只能列印出 12. 把memset去掉,能列印出123.
這是為啥啊?
這賦值有啥問題么?取值列印又哪里錯了?
uj5u.com熱心網友回復:
你的代碼錯誤typedef struct t2 {
TT *va;
} qq;
qq* w
你的w初始化了,但是w的va沒有初始化,對他的訪問是未定義行為。
uj5u.com熱心網友回復:
分配記憶體不對,改成以下,自己對比一下區別w=(qq*)malloc(sizeof(qq));
w->va = (TT*)malloc(5*sizeof(TT));
w = (qq*)malloc(len); //這里雖然多分配了記憶體,但是對于w->va來說還是沒有分配記憶體,w->va還是野指標
memset加上,會導致w->va的記憶體資訊為0,也就是w->va指向NULL,所以w->va[0].val = 5;會報空指標錯誤,也就是只能列印12
如果沒加上memset,w->va的記憶體資訊是隨機的(也就是野指標),w->va[0].val = 5;往野指標(也就是非法記憶體地址)寫入資料,會引起不可預知的錯誤,所以這次可能會列印出123,下次可能會列印出1234(也就是結果是隨機的),但程式終究是非法訪問別的記憶體,遲早會報錯。
uj5u.com熱心網友回復:
這和柔性陣列有什么區別?https://blog.csdn.net/tjw316248269/article/details/104791911 寫成陣列[],也不相當于指標么?uj5u.com熱心網友回復:
我咋感覺和柔性陣列差不多呢?我想把首地址就賦給w,申請處連續的空間,這倆有啥不一樣呢?
uj5u.com熱心網友回復:
指標不同于陣列,指標如果沒有明確初始化,他指向的是一個未知量陣列雖然可以轉為指標,但是在定義它的時候就已經確定了存盤位置。。
而指標則不同,你必須 xxx* x=malloc 或者 xxxx* x=&y; 方式來確定存在。
uj5u.com熱心網友回復:
你可以 int a[5];int *p =a;
單是你不可以
int *p=malloc(sizeof(int)*5);
int a[5] ;
a=p;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/141915.html
標籤:C語言
