1

以下の私のコードは、私が期待するunsignedcharポインターに異なる長さを与えました。pphとpphCharに対して12(または13)または0(または1)を取得する必要があると思いました。私の問題は何ですか?実行を繰り返すと、毎回長さとoneLengthで異なる結果が得られました。

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);

出力

割り当てられたmem13

文字1のサイズ

len32-毎回異なる

oneLength32-毎回異なる

4

2 に答える 2

7

\0文字列の最後にnullターミネータstrlenがないため、どこで終了するかを知ることができませんunsigned char *

実際には、アドレスから最後の文字までを数え続け、。に到達するまで調べます\0

于 2012-06-14T01:21:42.737 に答える
2

strlen終了文字(0())に基づいて長さをカウントします'\0'

どちらの場合も似てstrlenいます。0を探しているのと同じですが'\n'、「終了」として指定しただけで、終了する0が見つかるまでその文字を読みます。これは、「ゴミ」に応じて、さまざまな場所で見つかる可能性があります。メモリにはたまたま含まれています

終了していない文字列を処理すると、多くの場合、プロジェクトに割り当てられていないメモリにアクセスする「文字列」を超えて読み取るときにプログラムが終了するセグメンテーション違反が発生する可能性があります。

于 2012-06-14T01:22:00.817 に答える