void writelines(char** lineptr, int nlines)
{
for (int i = 0; i < nlines; i++)
printf("%s\n", lineptr[i]);
}
는 segfault 안나는데
void writelines(char** lineptr, int nlines)
{
while (nlines-- > 0)
printf("%s\n", *lineptr++);
}
는 segfault 남.
근데 두개가 동일한거 하지 않나?? 이해가안감
main (int argc, char* argv[])
{
int nlines, c;
int numeric = 0;
while (--argc > 0)
if ((*++argv)[0] == '-')
while ((c = *++argv[0]) != 0) {
switch (c) {
case 'n':
numeric = 1;
break;
case 'r':
printf("reverse\n");
break;
}
}
if ((nlines = readlines(lineptr, MAXLINES)) >= 0) {
qsort_e((void **) lineptr, 0, nlines - 1,\
(int (*)(void*,void*))(numeric ? numcmp : strcmp));
printf("%d\n",nlines);
writelines(lineptr,nlines);
freelines(lineptr,nlines);
return 0;
} else {
printf ("input Too Big To sort\n");
return 1;
}
}
freelines에서 segfault나는거임? 아니면 두번째 writeline 호출하자마자 segfault나는거? 어느 부분에서 segfault 발생하는지 알려주셈
두번째
아 그리고 main에서 lineptr 은 char* lineptr[MAXLINE]; 으로 정의된 전역변수임
첫번째 함수는 lineptr의 값(주소값)을 바꾸지 않고, 두번째 함수가 lineptr의 값을 바꾸긴 하는데 (함수 종료되면 문자열 배열에서 마지막 요소를 가리키고 있음) 예제 말고 두번째 함수만 떼서 예제코드 돌려보니까 잘 되는데?
lineptr이 함수인자라서 lineptr++는 함수 바깥의 lineptr 값을 바꾸지않음 애초에 배열이라 못바꾸고 그리고 저거두개가 같은거라 당연히 잘 될텐데, 내 프로그램에서만 두번째꺼로하면 저 함수에서 segfault가 난다는 거임. 저 함수에서 나는거도 확인햇음 ㅇㅇ
그러네 부작용은 없네; 어쨌든 도움이 못 되서 미안하다 segfault 왜 발생하는지는 잘 모르겠음
해결햇음 저게문제가아니라 qsort_e가 재귀함수인데 안에껄 qsort 로 재귀시켜서 나오는문제엿음 ㅋㅋㅋ
오 ㅊㅋㅊㅋ - dc App
참고하셈:
https://pythontutor.com/c.html#mode=edit
오 머야 집가서 이거돌려바야겟네
와 이거 개지리넹 ㅋㅋㅋ
입력을 잘못 받은거 아님? nlines 들어가는 리턴값이 잘못됐다거나
첫번째 두번째 같은거 맞음? 연산자 우선순위 헷갈리노