无法将整数写入缓冲区内的偏移量(char *)

时间:2015-11-01 01:29:09

标签: c++ c pointers memcpy memset

我正在尝试在我的C程序中将unsigned integer写入缓冲区中的特定偏移量。缓冲区是典型的1字节char *缓冲区。 我正在使用memcpy通过一些指针算法将memcpy目标指向具有该缓冲区的特定偏移量。

代码:

char* ph = (char*) malloc(4096);

//Init buffer with '\0'
memset(ph, '\0', 4096);

//Set int to be written
unsigned int tupleCnt = 4;

//Write to 4th byte offset (int* + 1)
memcpy(((int*) ph) + 1, (void *) &tupleCnt, sizeof(tupleCnt));

但是,这不会向此缓冲区写入任何内容。

这是写入此缓冲区的文件的hexdump:

0000000 0000 0000 0000 0000 0000 0000 0000 0000
               ^

如果我将其写入第0个偏移量,则可以正常工作:

//Write to 0th byte offset (int* + 0)
memcpy(((int*) ph) + 0, (void *) &tupleCnt, sizeof(tupleCnt));

这是hexdump:

0000000 0004 0000 0000 0000 0000 0000 0000 0000
          ^

顺便说一句,我正在使用fwrite将此缓冲区写入文件,如果它有任何区别。

fwrite(ph, 1, strlen(ph), fp);

我也尝试在char *指针上使用逐字节递增,但它也没有帮助。 例如:

//Write to 4th byte offset (int* + 1)
memcpy(ph + 4, (void *) &tupleCnt, sizeof(tupleCnt));

提前致谢! 或者有没有其他方法可以将int(或任何数字)值写入char *缓冲区?除了int到字符串对话,我真的想避免。我认为这是太多的开销和天真的方法。 :)

2 个答案:

答案 0 :(得分:1)

您问题不在 func loadData(){ timelineData.removeAllObjects()//(keepCapacity: false) let findTimelineData:PFQuery = PFQuery(className:"Sweets") findTimelineData.findObjectsInBackgroundWithBlock { (objects:[PFObject]? , error:NSError?) -> Void in if error == nil { self.timelineData = objects! as? [PFObject] //let array:NSArray = self.timelineData.reverseObjectEnumerator().allObjects // self.timelineData = array as NSMutableArray self.tableView.reloadData() } } } 中,而在于您写入文件的方式:

memcpy

此代码写入0个字节,因为fwrite(ph, 1, strlen(ph), fp); 返回从开始到第一个strlen的字节数,在您的情况下为零字节。

答案 1 :(得分:1)

strlen(ph)会在看到空字符时停止计数。 由于您已将缓冲区归零,因此当您在第4个字节偏移量上写入时,strlen(ph)将返回零,而在写入第一个字节偏移量时则不会。使用fwrite(ph, 1, 4096, fp);

同样要写整数,您可以使用此

int *ih = (int*)ph;
ih[1] = tuplecnt;