我正在测试下面的代码,但输出只是说
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 :(得分:3)
int
某种尺寸。将2
添加到char*
时,指针前进两个字节;要按int
的大小推进它,你需要(char*)(buf + 2)
。超过buf
的两个字节可能是buf[1]
,或者它可能是buf[0]
的一半,但显然它指向零,因为这是您通过以后取消引用ptr
得到的结果 - { {1}}是NULL
。将字符串传递给0
时,不要先取消引用它。
printf
在这种情况下,它会使用您的示例char *ptr = (char*)(buf + 2);
printf("ptr char = %s\n", ptr);
打印零个或一个字符。
答案 1 :(得分:0)
char *ptr;
ptr = (char*)buf+2;
printf("ptr char = %s\n",*ptr);
ptr是一个指针,所以* ptr是它指向的字符。当printf正在等待字符串(char指针)时,你使用一个字符作为参数,因此它崩溃了
以前您已经分配了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'
。所以除非你清楚地理解它,否则不要使用指针,否则你会看到很多严重的分段错误,而不是像这种情况那么简单