memcpy
메모리를 할당하지 않습니다. memcpy
호출에서 변수 arr
(char arr[400]
)이 정의되면 대상 메모리 arr
이 할당되었습니다.
충분한 공간을 할당하지 않은 경우 문제가 있습니다. arr
에 sizeof(updata)
바이트를 복사합니다. 이는 아마 1 + 4 + 7 * 256 = 1797입니다 (sizeof(int)
에 따라 달라질 수 있으며 __packed__
이 플랫폼에서 사용되지 않는 바이트를 실제로 제외하는지 여부에 따라 달라질 수 있습니다). arr
이 정말로 필요하다면 (아마도 그렇지 않을 수도 있습니다.) 적어도 sizeof(updata)
크기로 만드십시오. char arr[sizeof(updata)]
으로 정의하는 것이 좋습니다.
구조체의 레이아웃이 외부 형식으로 정의 된 경우 int
(플랫폼에 따라 2 또는 4 바이트) 대신 고정 크기 유형을 사용해야하며 다른 크기 일 수는 있지만 가능성은 낮습니다 그들을 만나기).
구조의 레이아웃이 일부 외부 바이너리 형식으로 정의되고이 형식으로 1797 바이트를 인쇄하려면 fwrite
을 사용하십시오.
fwrite(updata, sizeof(updata), 1, stdout);
하면, 데이터의 인간 표현이 적절한 형식 사양을 printf
을 사용합니다.
printf("ip='%c' udp=%d\n", updata.ip, updata.ip);
for (i = 0; i < sizeof(updata.rules)/sizeof(updata.rules[0]); i++) {
puts(updata.rules[i].myname);
}
이름에도 불구하고 실제로는 char
이 바이트 유형입니다. C의 문자에는 별도의 유형이 없습니다. 'a'
과 같은 문자 상수는 사실 정수 값입니다 (거의 모든 시스템에서 97, ASCII). 바이트를 문자로 해석하게하는 것은 putchar
또는 printf("%c", …)
으로 쓰는 것과 같습니다.
포인터 (예 : char*
)을 정수와 혼합 할 때 컴파일러에서 오류를 알리는 메시지가 표시되지 않으면 경고 수준을 높입니다. GCC를 사용하려면 적어도 gcc -O -Wall
을 사용하십시오.
실제로 코드를 컴파일 후, 메인 오류가 (당신은 당신의 질문에 컴파일러에서 오류 메시지를 복사 - 붙여 넣기해야) :
udpdata.rules[0].myname = "lalla\0" ;
udpdata.rules[0].myname
바이트의 배열입니다. C의 배열에 할당 할 수 없습니다. 요소를 하나씩 복사해야합니다. 이것은 char
의 배열이고 문자열을 복사하려는 경우 strcpy
을 사용하여 문자열의 모든 바이트를 복사 할 수 있습니다. 일반적으로 바이트 묶음의 경우 memcpy
을 사용합니다.
strcpy(udpdata.rules[0].myname, "lalla");
는 모든 규모의 검증을 수행하지 않습니다
strcpy
때문에 (
"lalla\0"
는 모든 문자열 리터럴이 C.¹에 제로 종료됩니다
"lalla"
에 해당합니다), 당신은 확인해야하는 최종 NULL 문자를 포함한 문자열 ()는 대상에 할당 한 메모리에 적합합니다. 최대 크기를 지정하려면
strncat
또는
strlcpy
과 같은 다른 기능을 사용할 수 있습니다.
¹ "lalla"
이 제로 종료되지 않는 경우가 하나뿐입니다 (예외적 인 경우 만 해당). 예 : 5 바이트 배열을 초기화 할 때. char bytes[5] = "lalla"
. 배열 크기가 6 이상이거나 지정되지 않은 경우 0 바이트가 종료됩니다.
게시자가 게시 한 코드가 무엇인지 구체적으로 언급 한 경우 도움이 될 수 있습니다. 세 가지 개별 문제가 있지만 그 중 어떤 것도 직접 언급하지는 않습니다. –