2012-06-14 80 views
1

我的代码给了我期望的无符号字符指针的不同长度。 我以为我应该得到12(或13)或0(或1)为pph和pphChar。 我的问题是什么?当我重复跑步时,每次都得到不同的长度和长度的结果。什么是无符号字符strlen的正确方法*

我怎样才能得到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); 

OUTPUT

分配MEM 13

大小炭1

len个32 - 每次都不同

oneLength 32 - 每次都不同

+9

您不会零终止字符串,所以结果是随机的。 – bmargulies

+0

顺便说一下,'sizeof(char)'和'sizeof(unsigned char)'保证是1. –

+0

你可以用C++编写C语言,但是这种方式不符合目的吗? – David

回答

7

你缺少结束时为空终止符\0字符串strlen无法知道unsigned char *结束的位置。

实际上,它通过查看直到达到\0后,继续计算最后一个字符的地址。

+0

谢谢。我把\ n与\ 0混淆了。 – dysonfree

2

strlen将基于终止字符计数长度,即0('\0')。

两种情况都是类似的:由于strlen正在查找0,但您只指定'\n'作为“结束”,它将读取该字符直到它找到终止0,它可能会在不同位置找到内存碰巧包含什么“垃圾”

处理未终结的字符串通常最终会出现一个分段错误,在读取过去的“字符串”访问没有为该项目分配的内存时会终止程序。

+0

没有终止字符使其短于预期。 –

+0

@ChrisStratton - thx,我有alsreay改变了答案后,我意识到我混淆OP的''0'与终止''\ 0'' – Attila

相关问题