2010-02-12 2 views
1

나는 다음과 같은 문제를 가지고 : 지금은 모든 가능한 조합을 계산할 필요가 나는 문자 포인터char 포인터의 배열 요소의 총 문자 길이를 결정하는 방법은 무엇입니까?

char *opts[] = { "-a", "--append", "-b" }; 

의 배열 및

char cmd[] = "ls"; 

에 저장된 명령 이름이

을하는 I GNU Scientific Library를 사용하고 계산 조합을 사용하여 명령을 실행했습니다.

내가 가진 문제는 char *가 system()으로 전달되는 데 필요한 메모리 양을 계산하는 방법입니다. 이 일,

int length = strlen(cmd) * sizeof(char); 

for (int i = 0; i < 3; ++i) { 
    length += strlen(opts[i]) * sizeof(char); 
} 

음,하지만 난이/오른쪽 최선의 해결책이 아니라고 감지 :

여기 내 첫 번째 시도입니다. 2 차원 배열을 평면 1 차원 배열로 캐스팅 할 수없고 크기를 가져올 수 없습니다 (잘못이 아니라면 C의 다차원 배열이 아니며 C는 그 배열을 모방합니다). 당신은 두 가지를 가지고 있지 않는 한

+0

모든 것을는 일차원에 매핑 결국 때문에 : 그것을 사용의 우리가 일부를 넣을 수 있습니다, 이미 표시된 다운 한 동안 tommie75의 답변을 sizeof(char)은 평등 1.

PPS를 보장합니다 메모리 공간, 아무 언어 진정으로 다차원 배열을 가지고 ... – fortran

답변

2

나는 여기

기술적으로 플랫 한 차원 배열에 충실하지만 관련이없는 두 차원 배열을 캐스팅 할 수 없습니다 차원 배열. 당신은 길이가있는 값의 1 차원 배열을가집니다. 이러한 문자열이 인접한 메모리에 있다는 보장이 없으므로 한 번에 총 크기를 측정하는 것은 불가능합니다.

원하는 방식으로 원하는 평가판을 얻을 수있는 유일한 방법입니다.

P.

int numelem = sizeof(opts)/sizeof(opts[0]); 
for (int i = 0; i < numelum; ++i) 
{ 
    length += strlen(opts[i]) * sizeof(char); 
} 
+0

제임스 : 고마워! :) 질문의 오해의 소지가있는 제목을 지적한 나의 편집 된 대답을보십시오 ... – t0mm13b

+0

Btw, 나는 sizeof (char)가 1과 동등하다는 것을 보증하지 않을 것입니다 - 결과로 정의 된 implmentation, 어떤 시스템에서는 2 ... http : //stackoverflow.com/questions/2252033/in-c-why-is-sizeofchar-1-when-a-is-an-int – t0mm13b

+1

@ tommieb75 : C 표준은 다음과 같습니다 : ' char, unsigned char 또는 signed char, 또는 그것의 정규화 된 버전 인 피연산자에 [sizeof가 적용될 때] 결과는 1입니다. ' sizeof ((un)? signed)? char *는 표준 C에서 1로 보장됩니다. –

관련 문제