문자열의 선언

char carray[]={'a','b','c'};//문자배열로 널값이 없으므로 Stack에3바이트 저장되고 코드영역에 3바이트 저장되있다
char astring[]={'a','b','c','\0'};//문자열 스텍4바이트 코드 4바이트
char bstring[]="abc";//문자열 스텍 4바이트 코드 4바이트
char *cstring[]="abc";//문자열 스텍 4바이트 코드 4바이트

문자열 상수의 내용을 변경 시키는 프로그램의 예

#include <stdio.h>

int main()
{
  char *cstring = "abc"//*cstring 주소는 stack 에 저장되어 있다
  
  printf("cstring:     %p    %s\n",cstring,cstring);//"abc"의 주소이기 때문에 코드영역에 있다
  cstring="def";
  printf("cstring:     %p    %s\n",cstring,cstring);

  return 0;
}


8.4 gets()와 puts() 함수

scanf 는 입력 받는 사이즈를 알수가 없으므로 &A 주소에 받는대로 값을 넣는다.
그러면 버퍼 오버플로우가 생기는데 해킹수단으로 잘 이용된다.

gets()도 버퍼 크기 인자가 없어서 해킹의 위험이 크다.

#include<stdio.h>

int main()
{
  char string[80];
  printf("Please enter a sentence: ");
  gets(string);
  puts(string);

  return 0;
}

입력을 정해진것 보다 더 넣게 되면 오버플로우가 발생한다.