C의 정수 배열에 대해 memset 사용
char str[] = "beautiful earth";
memset(str, '*', 6);
printf("%s", str);
Output:
******ful earth
위의 memset 사용처럼 몇 개의 정수 배열 인덱스 값만 아래와 같이 1로 초기화할 수 있습니까?
int arr[15];
memset(arr, 1, 6);
아니, 넌 아니요,사용할 수 없습니다를 사용하지 못한다.memset()
이것처럼.맨 페이지에는 (내 것을 강조함)라고 쓰여 있습니다.
그 그
memset()
기능은 첫번째 함수가 첫을 채우번째를 채우다n
에 의해 지시된 메모리 영역의 바이트s
로 계속된 바이트 일정한 바이트로c
.
한 그 이후로는기 때문에int
보통 4바이트 이 안 통한다보통 4바이트입니다.이렇게해도 잘리지 않습니다.
만약 네가 (잘못했어!!))이 처리를 시도합니다.
int arr[15];
memset(arr, 1, 6*sizeof(int)); //wrong!
첫째 6그후 처음 6개.int
S는 배열에 실제로 0x01010101=16843009으로 설정됩니다.어레이내의 s는, 실제로는 0x010101=16843009로 설정됩니다.
그것이 정말 데이터의non-byte datatype(s)과"방울"를 새로 쓰는 것이 괜찮은 유일한 시간,바이트가 데이터 타입을 가진 데이터의"블러브"에 쓰는 것이 실제로 허용되는 유일한 시기는 다음과 같습니다아닌 있다.memset(thing, 0, sizeof(thing));
전체 struture/array"zero-out".전체 스트럿/어레이를"제로 아웃"할수 있습니다.NULL, 0x000000, 0.0의 경우 0으로 설정합니다.
해결방법은 다음과 같습니다.for
이치노
int arr[15];
int i;
for (i=0; i<6; ++i) // Set the first 6 elements in the array
arr[i] = 1; // to the value 1.
단답, 아니요.
memset
는 단일 바이트이기 때문에 바이트를 설정하고 문자에 대해 기능하지만 정수는 그렇지 않습니다.
및에서는 Linux, OSX는 UNIX를 사용합니다.wchar_t
인데 32비트라고 .wmemset()
memset()
.
#include<wchar.h>
...
int arr[15];
wmemset( arr, 1, 6 );
:wchar_t
MS-Windows는 16비트이기 때문에 이 트릭은 동작하지 않을 수 있습니다.
아무도 얘기 안 했으니까...
이 「」인 할 수 만,1
memset을 사용하여 값을 사용하여 초기화할 수 있습니다.-1
대신 부정적인 가치로 작동하도록 논리를 바꾸세요.
들어 첫를 "6"으로 -1
수 것 같다
memset(arr,-1,6*(sizeof int));
이1회만 는, 을 값 「」으로할 수 .1
컴파일 시간부터.
int arr[15] = {1,1,1,1,1,1};
★★★★★★★★★★로 가능합니다.memset_pattern4
4번입니다.
memset_pattern4(your_array, your_number, sizeof(your_array));
의 세 sizememset입니다. 총 를 '알겠습니다'로 .arr[15]
memset(arr, 1, sizeof(arr));
단, 값 1을 arr의 전체 요소로 설정해야 합니다.그럼 루프를 켜는 게 좋을 거야
for (i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) {
arr[i] = 1;
}
★★★★★★★★★★★★★★★★★★memset()
1번으로 하다기대했던 게 아니었군요
'은수 .memset
을 위해서,가 「」가 아닌 한.0
memset
영역을 하고, 「」의 하지 않습니다.int
s.
꽤 모리영영영영 a a is is a on음음음음음음 on on on on on on on on on on on on on on on on on on on on에 하고 있습니다.memcpy
. memcpy
데이터를 정방향으로 복사하다
int arr[15];
arr[0] = 1;
memcpy(&arr[1], &arr[0], sizeof arr - sizeof *arr);
물론 이건 꽤 추악한 해킹이죠 표준적인 행동 때문에memcpy
소스 및 대상 메모리 영역이 겹치면 정의되지 않습니다.의 독자적인 버전을 작성할 수 있습니다.memcpy
단, 데이터를 정방향으로 복사하여 위와 같이 사용합니다.하지만 그것은 정말 가치가 없다.단순한 사이클을 사용하여 어레이 요소를 원하는 값으로 설정합니다.
Memset은 1바이트의 데이터 유형 값을 설정하지만 정수는 4바이트 이상이기 때문에 작동하지 않고 가비지 값을 얻을 수 있습니다.주로 char나 string 타입으로 작업할 때 사용합니다.
다음 프로그램을 시도해보니 memset()을 사용하여 어레이를 초기화할 수 있는 것은 -1과 0뿐입니다.
#include<stdio.h>
#include<string.h>
void printArray(int arr[], int len)
{
int i=0;
for(i=0; i<len; i++)
{
printf("%d ", arr[i]);
}
puts("");
}
int main()
{
int arrLen = 15;
int totalNoOfElementsToBeInitialized = 6;
int arr[arrLen];
printArray(arr, arrLen);
memset(arr, -1, totalNoOfElementsToBeInitialized*sizeof(arr[0]));
printArray(arr, arrLen);
memset(arr, 0, totalNoOfElementsToBeInitialized*sizeof(arr[0]));
printArray(arr, arrLen);
memset(arr, 1, totalNoOfElementsToBeInitialized*sizeof(arr[0]));
printArray(arr, arrLen);
memset(arr, 2, totalNoOfElementsToBeInitialized*sizeof(arr[0]));
printArray(arr, arrLen);
memset(arr, -2, totalNoOfElementsToBeInitialized*sizeof(arr[0]));
printArray(arr, arrLen);
return 0;
}
이상적으로는 memset을 사용하여 모든 것을 1로 설정할 수 없습니다.
왜냐하면 memset은 바이트로 동작하며 모든 바이트를 1로 설정하기 때문입니다.
memset(hash, 1, cnt);
이 값을 읽으면 16843009 = 0x0101 = 10000000100000001이 표시됩니다.
0x00000001이 아님
, 또는 binary 값 C C99 표준을 하여 설정할 수 .
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h> //Use C99 standard for C language which supports bool variables
int main()
{
int i, cnt = 5;
bool *hash = NULL;
hash = malloc(cnt);
memset(hash, 1, cnt);
printf("Hello, World!\n");
for(i=0; i<cnt; i++)
printf("%d ", hash[i]);
return 0;
}
출력:
아아아아아!
11 1 1 1 1 1 1
언급URL : https://stackoverflow.com/questions/17288859/using-memset-for-integer-array-in-c
'source' 카테고리의 다른 글
VueJ는 div 래퍼 없이 계산된 값을 원시 HTML로 취급합니다. (0) | 2022.08.13 |
---|---|
Java8: Stream / Map-Reduce / Collector를 사용한 HashMap to HashMap (0) | 2022.08.13 |
vue cli 3에서 생성된 프로젝트에서 개발 서버를 시작하는 중 (0) | 2022.08.13 |
Vue 라우터가 페이지를 변경할 때 Jquery 플러그인/스크립트를 로드하는 방법 (0) | 2022.08.13 |
java: Class.isInstance와 Class.isAssignableFrom (0) | 2022.08.12 |