2014-02-09 62 views
0

我測試下面的代碼,但輸出只是說鑄造整數作爲另一個字符指針

ptr char = (null) 

任何線索,爲什麼發生這種情況?

int buf[1024]; 
buf[0] = 10; 
buf[1] = 0; 
buf[2] = 1992; 
buf[3] = 42; 
buf[4] = 5; 
char *ptr; 
ptr = (char*)buf+2; 
printf("ptr char = %s\n",*ptr); 

我剛剛對上面的代碼進行了試驗,以便我可以逐部分知道下面的代碼會做什麼。 這裏是我工作的

int fillNSendHttpReq(int8u seq, char* domain, char* uri, char method, char* contentType, char* otherHeader, int contentLen, char* content, unsigned char timeout, char moreData, char isHttps) 

{ 
int16u encodedLen = moreData?contentLen|0x8000:contentLen; 

//if moredata = true then encodelen = contentlenBITWISEOR0x8000 
char *ptr = NULL; 
int8u buf[1024]; 
memset(buf, 0, sizeof(buf)); 

buf[0] = SNIC_HTTP_REQ; 
buf[1] = seq; 
*((int16u*)&buf[2]) = 0x5000; //swapped 
buf[4] = method; 
buf[5] = timeout; 



if (isHttps) { 
buf[0] = SNIC_HTTPS_REQ;//SNIC_HTTPS_REQ = 0 
*((int16u*)&buf[2]) = 0xbb01; // 443 swapped 
} 

ptr = (char*)buf+6; //convert in8u to char * ??? 
ptr += sprintf(ptr, "%s", domain)+1; //ptr = ptr + strlen(domain)+1 
ptr += sprintf(ptr, "%s", uri)+1; 
ptr += sprintf(ptr, "%s", contentType)+1; 
ptr += sprintf(ptr, "%s", otherHeader)+1; 
*((int16u*)ptr) = swap16(encodedLen); 
ptr += 2; 

if (contentLen) 
    memcpy(ptr, content, contentLen); 

serial_transmit(CMD_ID_SNIC, buf, ptr-(char*)buf+contentLen, ACK_NOT_REQUIRED); 
return 0; 

我不明白的是,ptr-(char*)buf+contentLen被分配到定義爲int等變量這讓我困惑在哪裏我的內容去這是一個燒焦的部分代碼。

+0

你在混合'char *'和'int *'。不要這樣做。你的編譯器應該大聲抱怨。 –

+0

對不起,我只是試驗,因爲我試圖知道代碼的作用(我將編輯並附上我正在處理的代碼) – nciacrklo

回答

3

int一些大小。當您將2添加到char*時,指針前進兩個字節;按照int的大小推進它,你會做(char*)(buf + 2)。通過buf的兩個字節可能是buf[1],或者它可能是buf[0]的一半,但顯然它指向零,因爲這是通過汲取ptr後得到的 - NULL0。將字符串傳遞給printf時,不要先取消引用。

雖然我並不知道如何修復那部分,因爲它沒有多大意義。如果你的代碼是接近你的意圖,那麼這可能是它應該是什麼:

char *ptr = (char*)(buf + 2); 
printf("ptr char = %s\n", ptr); 

在這種情況下,它會打印零個或一個字符,你的榜樣buf

+0

我編輯了我的問題以便讓您看到什麼功能我試圖解剖和理解。 – nciacrklo

+0

@ user3136985:這有點不同。重要的是,'buf'是一個'int8u'數組,它(大概)等同於'unsigned char' - * not *'int'。減法就是通過'sprintf'和'memcpy'獲得在'ptr =(char *)buf + 6'和'serial_transmit'之間添加的數據長度的一種方法。 – Ryan

+0

這就是我的想法,但當我想到必須作爲POST請求傳遞的實際內容時,它又讓我感到困惑,所以我懷疑並試圖澄清它。 謝謝你的信息很好,先生! – nciacrklo

0
char *ptr; 
ptr = (char*)buf+2; 
printf("ptr char = %s\n",*ptr); 

ptr是一個指針,所以* ptr是它指向的字符。當printf正在等待字符串(字符指針)時使用字符作爲參數使其崩潰

以前您已指定ptr = (char*)buf+2;buf[0] = 10;,因此buff中的第三個字節爲零,而不管字節順序如何。所以ptr現在指向buff [0]和buff [1]之間的一半,而ptr [0]是0,所以它包含一個空值。這就是爲什麼你看到的輸出

使用此

printf("ptr char = %s\n", ptr); 

但隨後你會看到另一個空的輸出,因爲PTR現在'\0' [0]。所以,除非你明確地理解它,否則不要玩弄指針,否則你會看到很多嚴重的分割錯誤,並不像這種情況那麼簡單

+0

哦,我明白了,對不起,我只是有點開始掌握這個想法,這就是爲什麼我問,所以我可以糾正。謝謝! – nciacrklo