2012-06-14 81 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

相關問題