유언비어 종결자 (2) - '수조 이름' 과 '바늘 변수 이름' 은 같은 것입니까?
===================================================================소스 코드1:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char *p1 = NULL;
char *p3 = NULL;
char p2[1024] = {0};
if (NULL == (p1 = malloc(1024))) {
printf("error in malloc
");
return -1;
}
printf("[%p]
", &p1 );
printf("[%p]
", p1 );
printf("[%p]
", &p2 );
printf("[%p]
", p2 );
printf("[%p]
", &p2[0]);
p3 = &p2[0];
printf("[%p]
", &p3 );
printf("[%p]
", p3 );
return 0;
}
================================================================ 실행 결과 인쇄1:
Administrator@1427-Michael ~/array
$ ./a.exe
[0x22ac4c]
[0x20010230]
[0x22a848]
[0x22a848]
[0x22a848]
[0x22ac48]
[0x22a848]
================================================================ 요약:
1. {&수조명, 수조명, &수조명 [0]}, 이 세 가지는 같은 물건으로 모두 수조에서 첫 번째 요소의 주소 값을 나타낸다!!!
2.'&수조명'의 기능은'&지침 변수명'과 같지 않습니다. 특히 주의하세요!!!
================================================================
예를 들어 만약 이 두 가지 총결이 가져온 위해를 분명히 하지 못했다면
소스 코드 2:
int foo(char **input)
{
char *p = *input;
if (NULL == p) {
printf("no memory to write
"); //
return -1; // for fail
}
else {
// do something!!
return 0; // for success
}
}
int main()
{
char *p1 = NULL;
char *p3 = NULL;
char p2[1024] = {0};
if (NULL == (p1 = malloc(1024))) {
printf("error in malloc
");
return -1;
}
p3 = &p2[0];
printf("ret is [%d]
", foo(&p1) );
printf("ret is [%d]
", foo(&p2) );
printf("ret is [%d]
", foo(&p3) );
return 0;
}
================================================================ 실행 결과 인쇄2:
$ ./a.exe
ret is [0]
no memory to write
ret is [-1]
ret is [0]
================================================================
다음 코드 보십시오: 원본 코드 3:
int foo(char *input)
{
if (input != NULL) {
printf("input is [%s]
", input);
return 0;
}
else {
printf("empty input
");
return -1;
}
}
int main()
{
char *p1 = "abcdefg";
char p2[] = "abcdefg";
foo(p1);
foo(p2);
return 0;
}
================================================================= 실행 결과 인쇄 3:
4
$ ./a.exe
input is [abcdefg]
input is [abcdefg]
요약:3.'수조명'과'바늘변수명'은 이런 상황에서 같은 효과가 있다.
종합: 1.{&수조명, 수조명, &수조명[0]}, 이 세 가지는 같은 물건으로 모두 수조에서 첫 번째 요소의 주소 값을 나타낸다!!! 2. '&수 그룹 이름'의 기능은'&지침 변수 이름'과 같지 않습니다. 특히 주의하세요!!! 3. '그룹 이름' 과 '바늘 변수 이름' 은 이런 상황에서 같은 효능을 가지고 있다.
마지막으로 나는'수조명'과'지침변수명'이 서로 다른 상황에서 서로 다른 효과가 있기 때문에 유언비어가 종결되었다고 말하고 싶다!
다음이야말로 관건이다. 왜'수조명'과'바늘변수명'은 때로는 같고 때로는 다른가?첫 번째 코드에서 우리는 이 몇 가지 물건의 구체적인 의미가 도대체 무엇인지 확실하게 이해할 수 있다.두 번째 코드에서 함수 intfoo(char**input)에 대해 호출자가 바늘 변수의 주소 값을 전달할 것을 기대하고 이 바늘 변수는 NULL이 아닌 합법적인 읽기 전용 메모리를 가리킨다.다시 말하면, 이 바늘 변수는 합법적으로 읽을 수 있는 메모리의 첫 번째 주소를 저장한다.말을 비교적 빙빙 돌려서 한다.그래서 이런 상황에서'&수 그룹 이름'과'&지침 변수 이름'을 전달하는 의미는 다르죠?어떤 사람이 말하기를, 내가 p2수 그룹이 정의할 때의 그 메모리에 데이터를 가져와야 하는데, 무슨 방법이 있습니까?답은 있어, 두 가지 더 있어!첫 번째:
char *tmp = NULL;
tmp = p2;
foo(&tmp);
두 번째:
char *tmp = malloc(1024);
foo(&tmp);
strncpy(p2, tmp, 1024);
free(tmp);
모두 효능에 도달했고 조작된 데이터를 p2의 메모리에 저장했다. p2는 전역 수조일 가능성이 높기 때문에 굳이 p2 메모리를 사용해야 하는 수요가 생겼다.
세 번째 코드에서 매개 변수를 전달할 때'수 그룹 이름'과'바늘 변수 이름'은 모두 첫 번째 주소 값을 전달하기 때문에 효능과 같다는 것을 나타냈다.
글에서 오류가 발생하는 것을 피하기 어려울 것입니다. 만약 당신이 발견한다면, 제때에 저에게 알려주십시오. 저는 시간이 있으면 바로 수정할 것입니다. 여러분을 오도하지 않도록, 감사합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.