안녕하세요. 13.5 강의를 듣고 실습 도중 궁금한 점이 있어서 질문 드립니다. 수업처럼 sample.txt 파일을 하나 만들고 나서 fread() 로 파일을 어떻게 읽는지 궁금해서 frwite() 로 쓸 때와 다른 순서로 fread() 를 해보았습니다. 그랬더니 순서를 맞췄을 때와 다른 결과가 나와서 관련되어 질문 드립니다. 우선 다음과 같이 코드를 작성했습니다. #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main() { // FILE write { FILE* fp = fopen("sample.txt", "wb"); int n = 100; double d = 10.0; float f = 3.14f; int* parr = (int*)malloc(sizeof(int)*n); if (!parr) exit(1); for (int i = 0; i < n; ++i) *(parr + i) = i * 2; fwrite(&n, sizeof(n), 1, fp); fwrite(&d, sizeof(d), 1, fp); fwrite(&f, sizeof(f), 1, fp); fwrite(&parr, sizeof(parr), 1, fp); } // FILE read { FILE* fp = fopen("sample.txt", "rb"); int n = 0; double d = 0.0; float f = 0.0f; size_t c0 = fread(&n, sizeof(n), 1, fp); printf("n: %d\tcount:%d\n", n, c0); size_t c2 = fread(&f, sizeof(f), 1, fp); printf("f: %f\tcount:%d\n", f, c2); size_t c1 = fread(&d, sizeof(d), 1, fp); printf("d: %f\tcount:%d\n", d, c1); int* parr = (int*)malloc(sizeof(int) * n); if(!parr) exit(1); size_t c3 = fread(&parr, sizeof(int), n, fp); printf("parr: %d\tcount:%d\n", *parr, c3); printf("fepf: %d\n", feof(fp)); free(parr); fclose(fp); } } size_t c1 과 size_t c2 의 코드상 순서를 위와 같이 했을 때는 출력 결과가 다음과 같았습니다. 출력 결과 n: 100 count:1 f: 0.000000 count:1 d: 49.920021 count:1 parr: -842150451 count:100 feof: 1 size_t c1 과 size_t c2 의 코드상 순서를 뒤집어서 fwrite()을 했을 때와 동일하게 한 경우 출력 결과가 다음과 같았습니다. 출력 결과 n: 100 count:1 d: 10.000000 count:1 d: 3.140000 count:1 parr: -842150451 count:100 feof: 1 여기서 질문입니다. 파일을 fread()로 sample.txt 파일을 읽을 때마다 인자로 입력한 크기만큼 책 읽듯이 앞에서 부터 데이터를 읽어서 파일 쓰기 값과 다른 f와 d의 결과가 나온 것일까요? 바이너리 파일을 읽을 때 fwrite()한 데이터 순서 상관 없이 존재하면 읽을 수 있는 방법이 있을까요? 웬지 일반적인 방법으로는 안될 것 같은데 순서대로 읽을 수 밖에 없는 것일까요? 또한 바이너리 파일 안에 어떠한 데이터 타입 포함되어 있는지 알 수 있는 방법이 있을까요? *parr의 경우 printf()로 출력하면 0이 출력 될 것이라 생각했는데 비정상적인 값이 나와서 놀랐습니다. 여러 생각을 해보았으나 원인이 잘 떠오르지 않아 왜 이런 값이 나오는지 여쭙습니다. 수업 주제를 넘어서는 질문인 것 같은데, 교수님께서 중간에 언급하신 '바이너리 파일의 구조를 모르면 해킹과 같은 방법으로 데이터를 읽어야 한다'고 하는게 상상을 해보면, 처음 부분부터 순차적으로 맞는 데이터를 찾을 때까지 (예를 들면) fread()를 반복해서 실행해 값을 확인하고 다음 데이터로 넘어가고를 반복하는 것일까요?
안녕하세요. 13.5 강의를 듣고 실습 중에 궁금증이 생겨 질문 드립니다. FILE* fp = fopen("sample.txt", "rb"); int n = 100; int* parr = (int*)malloc(sizeof(int)*n); for (int i = 0; i < n; ++i) *(parr + i) = i * 2; 위와 같이 if(!parr) exit(1); 부분을 빼놓고 코드를 작성하니 "NULL 포인터 parr+i 를 역참조 할 수 없다"고 MSVS에서 표기가 뜹니다. exit(1) 은 프로그램을 종료 시키는 것으로 알고 있었는데 동적할당 메모리 parr 이 처음 선언될 때 할당된 메모리의 첫 번째 주소를 리턴 받은게 아니라 NULL 로 리턴을 받을 수 있는 가능성이 있어서 MSVS에서 미리 경고를 주는 것일까요? 코드 실행 자체는 잘됩니다.
빌드를 해보던 도중 printk("dev_id:0x%x \n", (unsigned int)action->dev_id); 해당 줄에서 언사인드 인트가 포인터 인트 형 문제라고 하는데 printk("dev_id:%p\n", action->dev_id); 이렇게 바꿔서 진행해도 될까요? 아니면 워닝 무시하고 해보면 되나요?
여기서 헤드 포인터가 가리키는 데이터가 텍스트 세그먼트에 있기떄문에, 텍스트 세그먼트에 있는 데이터들은 프로그램이 만들어질떄 프로그램 파일에 포함이 되기 떄문에 수정이 불가능하다고 하셨는데, 그 이전에 문자열은 읽기 전용 데이타 세그먼트에 저장된다고 하셨는데, 왜 24분2초쯤에선 읽기전용 데이터 세그먼트가 아닌 텍스트 세그먼트에 저장된다고 하시는지 이유가 궁금합니다. 위 표의 프로그램 코드가 읽기 전용 데이터 세그먼트도 포함하는거라고 보면 될까요?
안녕하십니까 '더미 헤드를 갖는 리스트로 개선 및 검증' 학습하던 도중에, 마지막 노드인 'jang'을 삭제할 시에 읽기 엑세스 위반 오류가 뜨면서 정상적인 종료가 되지 않았습니다. 디버깅으로 살펴보니 pPrev->pNext도 마지막 노드이다 보니 NULL인 상태에서 pPrev->pNext 도 동일하게 NULL 인상태에서 발생한 문제인듯 합니다. 제생각에는 마지막 노드를 삭제할때는 pPrev->pNext NULL 경우에 대한 IF 절을 넣는게 맞아보이는데 맞는 조치일까요?
안녕하세요. char cookies[1] = {'A',}; 위 코드에서 이해가 안되는 점입니다. 문자 배열은 NULL 문자까지 포함해서 크기가 2여야 하는게 아닌지요? 위 배열 처럼 크기가 1인 경우 &cookies 주소의 바로 다음 주소가 NULL이되는 건지? (NULL은 어디에?) 이를 확인해 보기 위해 printf("%c\n", *(&cookies[0]+1)); 을 해보았으나 ? 가 출력되더라고요 다른 질문을 보니 , (콤마)의 경우 자동으로 NULL문자를 만들어 주기 위함으로 붙이는데 크기가 1인 배열에도 붙여 줘야 하는건지 궁금합니다.
안녕하세요, 강사님. 매번 빠르게 기출 분석 및 해설 강좌 업로드 해주심에 대단히 감사드립니다!!! 😄 글 제목과 관련된 위의 영상에서 말씀해주셨습니다만, 아직 인프런 강의 목록에서는 확인을 하지 못하여서요... 2편은 포함하여, 강의 업로드 계획을 문의드리고자 글 남깁니다. 항상 고생 많으십니다 ㅜㅜ 감사합니다.
17분 경에 나오는 다음 코드에 대해 제가 올바르게 이해 한 것인지 궁금해서 질문 드립니다. // 강의 17분 경 코드 const int** pp2; int* p1; const int n = 13; pp2 = &p1; *pp2 = &n; *p1 = 10; 제가 이해한 부분들입니다. 애초에 포인터 변수 p1 이 const 포인터 변수가 아닌데 이중포인터 변수 pp2 에 대입이 된 부분부터 일단 잘못 되었다. *pp2 = &n 은 *p1 = &n 과 동일하다. p1은 const 포인터 변수가 아닌데 const 변수 n의 주소가 대입되어 p1이 n의 값을 변경할 수 있게 되었다. 질문입니다. 포인터 변수에서 const가 데이터 타입 왼쪽에 있으면 indirection을 하지 못하게 방지 하는 역할로 알고 있는데 *pp2 = &n 이 어떻게 경고 없이 컴파일 된건지 궁금합니다. const 데이터 변수의 주소를 대입해서 그런걸까요?