2012-06-14 1 views
1

아래 코드는 예상 한 부호없는 char 포인터의 길이가 다릅니다. pph와 pphChar에 대해 12 (또는 13) 또는 0 (또는 1)을 가져야한다고 생각했습니다. 내 문제는 무엇입니까? 나는 달리기를 반복 할 때마다 length와 oneLength에 대해 다른 결과를 얻습니다.unsigned char *에 대한 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

32 렌 CHAR 1

13

크기 할당 MEM - 상이한마다

oneLength 32 - 다른마다

+9

문자열을 0으로 종결하지 않으므로 결과가 임의적입니다. – bmargulies

+0

BTW,'sizeof (char)'및'sizeof (unsigned char)'는 1로 보장됩니다. –

+0

C++로 C를 작성할 수는 있지만 그 목적을 상회하지는 않습니다? – David

답변

7

누락되고 null 종결 자 \0 끝 문자열 strlenunsigned char *이 어디에서 끝나는 지 알 수 없습니다.

실제로는 주소 뒤에 오는 문자가 \0에 도달 할 때까지 계속보고 있습니다.

+0

감사합니다. 나는 \ n을 \ 0과 혼동했다. – dysonfree

2

strlen은 0 ('\0') 인 종료 문자를 기준으로 길이를 계산합니다.

strlen은 0을 찾고 있지만 '\n' 만 "끝"으로 지정 했으므로 다른 위치에서 찾을 수있는 0을 찾을 때까지 해당 문자를 읽습니다.

"string"을지나 읽을 때 프로그램에 할당되지 않은 메모리에 액세스 할 때 마지막으로 끝나지 않은 문자열을 처리하면 프로그램이 종료되는 세그먼테이션 오류가 발생할 수 있습니다.

+0

예상보다 짧은 길이의 종료 문자가 없습니다. –

+0

@ChrisStratton - thx, OP의 '0'과 '\ 0'의 종료와 혼동을 느낀 후에 대답을 변경했습니다. – Attila

관련 문제