我正在测试下面的代码,但输出只是说
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
的变量,所以这让我感到困惑我的内容去了哪里,这是一个字符。
最佳答案
int
是一些大小。当您将 2
添加到 char*
时,指针前进两个字节;要将它推进 int
的大小,您需要执行 (char*)(buf + 2)
。 buf
之后的两个字节可能是 buf[1]
,也可能是 buf[0]
的一半,但显然它指向零,因为这就是您稍后通过取消引用 ptr
得到的结果——NULL
是 0
。将字符串传递给 printf
时,您不会先取消引用它。
不过,我真的不知道如何修复那部分,因为它没有多大意义。如果您的代码接近您的意图,那么它可能应该是这样的:
char *ptr = (char*)(buf + 2);
printf("ptr char = %s\n", ptr);
在这种情况下,它将使用您的示例 buf
打印零个或一个字符。
关于将整数转换为另一个字符指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21654775/