2013-04-08 3 views
0

이 나는 ​​대부분의 차이 주위에 내 머리를 가지고있다 생각하지만, 내가 올바른 생각한다면,이 또한 정확해야 :char 배열을 참조하는 것과 char 배열을 동일하게 지정합니까?

1)

char *string1 = (char*) malloc(runtime_determined_number); 

2)

char string2val[runtime_determined_number]; 
char *string2 = &string2val; 

여기서 string1과 string2가 같을 것이라고 예상 할 수 있습니다.이 경우입니까?

+0

무슨 의미에서 같습니까? 또한 첫 번째 샘플의 캐스트가 잘못되어 두 번째 불일치의 포인터가 입력됩니다. –

+0

H2CO3 : 포인터 유형 불일치가 없습니다. 이상하지만, '&'는 쓰지 않지만 유효합니다. – Dougall

+0

이것은 'C'질문으로 태그되었습니다. 나는 C가'char string2val [runtime_determined_number]; '와 같은 선언을 허용한다고 믿지 않는다. 런타임에 * compile time * 심볼을 사용할 수 있지만 런타임 변수는 사용할 수 없다. 나는 다른 곳에서 이것이 C89에서 나쁘다는 것을 알았지 만 C99에서는 괜찮습니다. 나는 너무 오래되었다고 생각한다. –

답변

1

string1string2 동일한 메모리 영역

string1 지적되지 않는 것은

+0

'runtime_determined_number'는'string2'의 동적 할당을하지 않습니까? –

+0

@MatthewHaworth C99부터는 런타임 var로 정적 배열을 정의 할 수 있지만 예제에서는 그렇지만 정적 할당이면서 동적 할당은 아닙니다. 동적 할당 메모리는 나중에 free()로 자유롭게 사용할 수 있지만 정적 메모리에는 사용할 수 없습니다. – MOHAMED

+0

'string2val' 및'string2'에 대해 표시된 정의가 함수 또는 외부에 나타날 수 있습니다. 유형 불일치가 수정 된 경우를 제외하고 표시된 것처럼 함수 안에 표시되는 경우 저장 기간은 정적이 아니라 자동입니다. –

0

둘 다 동일한 길이의 메모리 초기화되지 않은 블록을 가리 킵니다. 그 점에서 그들은 동일합니다, 네.

사례 1의 경우 작업이 끝나면 free에 대한 책임은 사용자에게 있습니다. 그리고 경우 2에서 메모리가 종료시 범위를 벗어날 수 있으므로 함수에서 포인터를 안전하게 반환 할 수 없습니다.

0

그들은 동일한 유형이며 최소한 runtime_determined_number 바이트가 할당된다는 점에서 비슷합니다.

그들은한다는 점에서 다르다 :

  1. 첫 번째 버전은 메모리 누수를 방지하기 위해 명시 적 free() 필요;
  2. 두 개체의 수명이 동일하거나 다를 수 있습니다.

두 번째 버전은 가변 길이 배열을 사용하기 때문에 C99에만 유효합니다.

0
정적 할당 char 어레이에 대한 포인터를 가리키는 malloc

string2 동적 할당 char 배열에 대한 포인터를 가리키는 것이다

malloc을 사용하면 런타임 중에 메모리를 요구합니다. malloc이 성공하면 할당 된 메모리로 작업 할 수 있습니다. 나중에이 메모리를 할당 해제해야합니다!
두 번째 부분에서는 char 배열을 만들고 해당 주소를 포인터에 할당합니다. 이 경우 메모리는 stack에서 가져오고 범위가 범위를 벗어날 때 자동으로 free d가됩니다.
char*은 메모리의 다른 위치를 가리키는 것과 같지 않습니다. 당신이 초기화하지 않은 것과 같은 쓰레기가 들어있는 우연한 기회가 있습니다 ...

관련 문제