获取unsigned char *的正确方法是什么?

时间:2012-06-14 01:18:51

标签: c++ strlen unsigned-char

下面的代码给出了我期望的unsigned char指针的不同长度。 我认为我应该为pph和pphChar获得12(或13)或0(或1)。 我的问题是什么?当我重复跑步时,每次长度和长度都有不同的结果。

如何获得pph的长度?

我需要在末尾放一个'\ n'来确定长度吗?

我使用VS2010,XP和C ++。

#include "stdafx.h"
#include <stdlib.h>
#include <Windows.h>
#include <stdio.h>
#include <tchar.h>

typedef unsigned char uint8_t;

int _tmain(int argc, _TCHAR* argv[])
{

int length;
int len = 13;
uint8_t *phh;
char * phhChar;

printf("assigned mem %d\n", sizeof(unsigned char)*len);
phh = (unsigned char *) malloc(sizeof(unsigned char)*len);
phhChar = (char *) malloc(sizeof(char)*len);

phh[0] = (unsigned char) '1';
phh[1] = (unsigned char) '2';
phh[2] = (unsigned char) '3';
phh[3] = (unsigned char) '4';
phh[4] = (unsigned char) '5';
phh[5] = (unsigned char) '6';
phh[6] = (unsigned char) '7';
phh[7] = (unsigned char) '8';
phh[8] = (unsigned char) '9';
phh[9] = (unsigned char) '0';
phh[10] = (unsigned char) '1';
phh[11] = (unsigned char) '2';
phh[12] = (unsigned char) '\n';

phhChar[0] = (char) '\n';

printf("size of char %d\n", sizeof(unsigned  char));
length =  strlen((const char*)phh);
int oneLength = strlen((const char*)phhChar);

printf("len %d\n", length );
printf("onelebgth %d\n", oneLength);

输出

指定了mem 13

char 1的大小

len 32 - 每次不同

oneLength 32 - 每次不同

2 个答案:

答案 0 :(得分:7)

您在字符串末尾缺少空终结符\0,因此strlen无法知道unsigned char *的结束位置。

实际上,它一直在计算你设置的地址到最后一个字符,直到达到\0为止。

答案 1 :(得分:2)

strlen将根据终止字符计算长度,该字符为0('\0')。

两种情况都是相似的:因为strlen正在寻找0,但你只指定'\n'作为“结尾”,它会读取该字符,直到它找到终止0,它可能会在不同的地方找到,取决于内存恰好包含的“垃圾”

处理未终止的字符串通常会导致分段错误,当读取超过“字符串”访问未分配给项目的内存时,将终止程序。