다음은 동일한 작업을 수행하고 동일한 출력을 제공하는 코드 예제입니다. 첫 번째에서는 포인터 인수를 사용하여 포인터를 사용하여 ans
을 전역으로 사용하지 않습니다. 제에서, I 만든 ans
포인터 포인터를 다룰 때 *
의 추가적인 사용을 배제하는 글로벌 :포인터 또는 전역 변수에 대한 포인터?
예 1
// pointer to pointer
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
unsigned char serial[] = {
0x1,0x2,0x3,0x4
};
void checkSerial(unsigned char* buf, unsigned char ** ans)
{
int i;
unsigned char *part;
part = 0;
i=2;
part = &buf[i];
*ans = (unsigned char*)malloc(2);
memset(*ans,0,2);
memcpy(*ans,part,2);
printf("0x%x\n",**ans);
++(*ans);
printf("0x%x\n",**ans);
}
int main(void)
{
unsigned char *ans, *buf;
while(1)
{
buf = malloc(4);
memset(buf,0,4);
memcpy(buf, serial, sizeof(serial));
checkSerial(buf, &ans);
--ans;
printf("the value is 0x%x\n", *ans);
free(buf);
free(ans);
sleep(3);
}
return 0;
}
예 2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
unsigned char serial[] = {
0x1,0x2,0x3,0x4
};
unsigned char ans[2];
void checkSerial(unsigned char* buf)
{
int i;
unsigned char *part;
part = 0;
i=2;
part = &buf[i];
int j;
for(j=0;j<2;j++)
{
ans[j] = part[j];
}
printf("0x%x\n",*ans);
++(*ans);
printf("0x%x\n",*ans);
}
int main(void)
{
unsigned char *buf;
while(1)
{
buf = malloc(4);
memset(buf,0,4);
memcpy(buf, serial, sizeof(serial));
checkSerial(buf);
printf("the value is 0x%x\n", *ans);
free(buf);
sleep(3);
}
return 0;
}
기술은 C에서 선호?
개인적으로 나는 사용하지 않을 것입니다. 당신은 이미 while 루프에서 buf를 할당하여 시리얼을 넘겨 주므로 ID는 while 루프에도 ans를 할당하고이를 checkSerial에 전달하여 채워지게됩니다. 또한 글로벌 ans는 그 답을 맞추기에 충분히 크지 않습니다. 단지 1 바이트가 2가 아님. – Dampsquid
'- ans' 포인터로'ans' 포인터를 감소시키고 싶습니까? 아마도 당신은 값을 줄이는 것을 의미했을 것입니다. 그것은'- * ans;'...입니까? – CiaPan
전역 변수는 확실히 권장되지 않지만 변수를 서로 멀리 할당하면 포인터에 대한 포인터를 만들면 어셈블리 수준에서 두 수준의 간접 참조가 만들어집니다. 이러한 변수가 단일 캐시에 캐시되지 않으면 잠재적 인 성능 손실이 발생합니다 프로세서가 스톨하고 두 번째 변수의 주소를 계산하고 해당 변수/캐시 라인을 작동하도록 유도합니다. – Recker