조건부 매크로없이 32 비트 및 64 비트 포인터를 모두 안전하게 처리하는 기술은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1533986

문제

원본 코드가 32 비트 포인터로 가정했기 때문에 라이브러리에서 일부 코드를 업데이트하고 있습니다. 나는 그것을 고치는 방법에 대한 내 생각을 가지고 있지만 철저하게,이 코드가 매크로없이 32 비트와 64 비트 모두에 사용할 수있는 기술이 무엇인지 물어보고 싶습니다.

char *argList = (char *)malloc(sizeof(id *) * argumentsCount);

크기 (ID *)는 32 비트에서 4, 6 비트에서 8입니다. char *arglist를 사용하여 객체에 대한 포인터 배열을 만들고 nsarray의 getObjects 메소드를 사용합니다.

[myNSArray getObjects:(id *)argList];

32 비트로 작동하고 64 비트로 충돌합니다 (명백한 이유로)

도움이 되었습니까?

해결책

나는 모든 맥락이 없지만 이것이 실제로 32/64 비트 문제가 아니라고 생각합니다. 아마도 당신이 원하는 것은 다음의 선을 따라 무언가입니다.

id *argList = malloc(sizeof(id) * argumentsCount);

상황에 따라, 나는 때때로 이미 할당 된 배분으로 이와 같은 메모리 블록을 할당하는 것을 좋아합니다.

id *argList = calloc(1UL, sizeof(id) * argumentsCount);

이 두 가지 모두 유지할 수있는 메모리 덩어리를 할당합니다. argumentsCount 개체에 대한 포인터 수. SO와 같은 개별 포인터에 액세스 할 수 있습니다.

argList[0] = [[NSString alloc] initWithUTF8String:argv[0]];
argList[1] = [[NSString alloc] initWithUTF8String:argv[1]];
NSLog(@"Argument 0 is: %@", argList[0]);

당신이 선언 할 때 argList 포인터로 char 예제에서했던 것처럼 개별 요소를 색인화합니다 (예 : argList[0], argList[1]), 할당 된 메모리의 개별 바이트에 액세스합니다. argList, 아마도 당신이 기대하는 개별 포인터가 아닙니다. 당신이 선언 할 때 argList ~처럼 id, 위에서 내가 할당 된 메모리를 통해 개별 요소 단계를 색인화합니다. argList ~에 의해 sizeof(id) 바이트. 컴파일러는 대상 아키텍처의 올바른 포인터 크기를 자동으로 보상합니다.

포인터가 다시 돌아 왔다고 가정합니다 malloc() ~이다 0x1000, 다음은 32 및 64 비트 모드에 대해 계산 될 주소 표입니다. char * 그리고 id * 선언 :

    32-bit: char *  id *     64-bit: char *  id *
argList[0]: 0x1000  0x1000           0x1000  0x1000
argList[1]: 0x1001  0x1004           0x1001  0x1008

왜 이것이 32 비트 모드에서 당신을 위해 일한 이유를 모릅니다.

다른 팁

Foundation에서 사용할 수있는 컬렉션 클래스 중 하나 대신 ID를 C 배열에 보관하는 이유는 무엇입니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top