유언비어 종결자 (2) - '수조 이름' 과 '바늘 변수 이름' 은 같은 것입니까?

4221 단어
"수조명과 바늘변수명은 같은 일"이라는 말을 자주 듣는데, 정말 그런가?말을 많이 하지 말고 먼저 코드를 하나 올려라!
===================================================================소스 코드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 메모리를 사용해야 하는 수요가 생겼다.
세 번째 코드에서 매개 변수를 전달할 때'수 그룹 이름'과'바늘 변수 이름'은 모두 첫 번째 주소 값을 전달하기 때문에 효능과 같다는 것을 나타냈다.
글에서 오류가 발생하는 것을 피하기 어려울 것입니다. 만약 당신이 발견한다면, 제때에 저에게 알려주십시오. 저는 시간이 있으면 바로 수정할 것입니다. 여러분을 오도하지 않도록, 감사합니다.

좋은 웹페이지 즐겨찾기