저는 C에서 매우 익숙합니다. 지금 프로그램에서 사용자가 문자 배열 (문자열)을 프로그램 이름 형식으로 입력하도록 요구하는 중입니다. 이 이름을 배열에 저장 한 다음이 배열을 다른 함수에 전달합니다. 지금배열에 사용자 입력 문자열이있어서 버퍼 오버플로가 발생했습니다.
, 나는 이것이 내가 사용자가 입력 할 수 있습니다 모르겠어요으로, 동적으로 할당 된 배열이며, 여기에 달성하기 위해 시도했습니다 최신 방법은 어떻게 그 일을 해요 :
char *process;
process = (char *)malloc(sizeof(char) * (i+1));
그때 printf
자신의 입력을 사용자의 입력을 요청하고 확인로 이동 : 나는 scanf()
실제로 작동하고 fgets()
가 원인이 모두 scanf()
및 fgets()
을 시도했습니다
printf("Enter process name: ");
scanf("%79s", &process); // take input, load into array
// fgets(process, sizeof(ARRAY_SIZE), stdin);
printf("You entered: %s\n", process[i]);
프로그램 내 printf
문을지나 완전히 뛰어 본으로 진행합니다 : 프로그램이 Segmentation Fault
로 종료 어디
for(i = 0; i < ARRAY_SIZE; i++)
printf("process = %s\n", process[i]);
합니다. 나는 이것이 할당 된 버퍼를 오버런하는 사용자 입력 때문이라는 것을 이해합니다.
gdb
에서 프로세스의 값을 인쇄 할 때 가비지가 채워집니다 (C가 값을 추가하기 전에 C가 배열을 초기화하는 방법입니다). scanf("%79s", &process)
바로 뒤에는 쓰레기를 교체하는 대신 쓰레기 시작 부분에 입력 한 내용이 표시됩니다. 내 질문은 버퍼를 오버런시키지 않도록 배열을 "비우는"방법이다. 3 일 동안 여러 가지 방법을 시도해 보았습니다. 배열을 제대로 초기화하는 방법에 대한 세부적인 내용을 놓친 것 같습니다. 나는 #define ARRAY_SIZE 80
을 가지고 있는데, 이는 나중에 구현할 때 충분하지 않을 수도 있지만,이 기능을 수행하기에 충분해야합니다.
도움을 주시면 감사하겠습니다.
당신은'i' 그 값 아직'는 scanf ("%의 79s", 공정)이 무엇인지 우리에게 얘기를 가지고,'이다 잘못되어'scanf ("% 79s", process) 여야합니다; – ouah
제대로 보이지 않는 약간의 코드가 있습니다. [MCVE] (http://stackoverflow.com/help/mcve)를 게시해야합니다. 그것은 여러분 모두가 코드가 옳지 않은 곳과 곳을 보는 데 도움이 될 것입니다. –
'i = '를 ARRAY_SIZE;로 초기화했습니다. 왜 원래의 버전과 반대되는'scanf ("% 79s"프로세스)를 사용합니까? 나는'process'의 시작 주소에 입력을로드하려고한다고 생각했습니다. 프로그램에서 잘 작동하지만 꽤 길게 만드는 몇 가지 다른 기능이 있기 때문에 MCVE를 함께 사용하겠습니다. – TomJ