[급질!!!] **string의 내용을 *string2으로 옮기는 방법이요..

kimjkr21의 이미지

제가 프로그램 짜다가
이중포인터에 저장된 스트링을 다시 포인터에 저장해야하는데..
포인터와 이중 포인터간의 구분을 명확하게 못하겠어요..

(예1)
char *str="abcde";
char **str2;

질문 1;
str2로 str의 내용을 복사할수 있을까요?

질문 2;
str로 str2의 내용을 복사할수 있는 방법 없을까요? 원래 str2가 일차원 포인터라면 strcat나 strcpy등등을 사용할수 있을건데, 이 함수들은 일차원 배열을 기본으로해서 처리해주는 함수들이라서 컴파일할때 warning: invalid pointer type..!!!.이라고 뜨거든요..위 두 가지 경우에 대해서 해결할 방법좀 갈켜주세요..상세한 설명좀 부탁드립니다. 책을 봐도 이해가 안가요..ㅜㅜ 포인터는 정말 어려워용..

지리즈의 이미지

strcpy, strncpy에서 이중포인터를 쓰는 경우
아래와 같이 사용합니다.

strcpy(*str2,str)

그리고

int *str="abcde";
int **str2;

대신

char *str="abcde";
char **str2;

로 해보세염.

warning: invalid pointer type..!!!.

이건 이 이유때문에 생기는 겁니다.
굳이 int저를 써야 한다면...

strcpy((char *)*str2,(char *)str)
로 타입케스트를 해주면...
워닝은 사라지겠지만..
결과는 어떨지 모르죠...

There is no spoon. Neo from the Matrix 1999.

익명 사용자의 이미지

일단, 그냥 포인터건 이중 포인터건 3중 포인터건 그것이 가리키는 개체(object)가 실제로 있어야 합니다.

int **pp;

pp가 가르키는 int *형 개체가 있어야 합니다.

int ***ppp;

역시 ppp가 가르키는 int **형 개체가 있어야죠.

Quote:

(예1)
int *str="abcde";
int **str2;

문자열을 다룬다면 char *, char ** 가 맞겠지요.

char *str = "abcde";
char **str2;

Quote:

질문 1;
str2로 str의 내용을 복사할수 있을까요?

일단 str2가 '실제로 존재하는' char *형 개체를 가리켜야 합니다. 일단은, 새로 할당받아서 쓰기로 합시다.

str2 = malloc(sizeof(*str2));

그다음에는 두가지 방법이 있습니다.

*str2 = str;    // 그냥 *str2도 str과 똑같은 문자열 상수를 가리키게 한다.

또는

*str2 = malloc(strlen(str) + 1); // *str2가 새로운 메모리 공간을 가리키게 한다. 
strcpy(*str2, str); // *str2가 가리키는 공간에 str가 가리키는 문자열 상수를 복사한다.
익명 사용자의 이미지

Quote:

질문 2;
str로 str2의 내용을 복사할수 있는 방법 없을까요?

str2에 제대로 메모리가 할당되어 있다는 가정 하에

str = malloc(strlen(*str2) + 1);
strcpy(str, *str2);
kimjkr21의 이미지

에고공..죄송합니다..잠오는거 참아가면서 글을 썼더닝...
그만 오타를..위에
int *str가 아니라..char *str 입니다..정말 죄송죄송..ㅜ.ㅜ...

kimjkr21의 이미지

위에답변 해주신분들 넘넘 감사드립니다..^^
조언해주신대로 수정해서 컴팔을 해보니 아래와 같은 워닝이 그대로 뜨더라구요..문제가 무엇인지..ㅜ.ㅜ

"warning; passing arg 1 of 'strcpy'from incompatible pointer type.."

도와주세용.

litdream의 이미지

지리즈님께서 마지막에 쓰신 부분에 보면:
strcpy((char *)*str2,(char *)str)

이렇게 카피하면 invalid pointer 안나올겁니다.
무조건 도와달라지말고, 답변 써주신 분 성의를 생각해서, 끝까지 잘 읽읍시다.

아울러, segmentation fault 를 대비해서, malloc 도 잘 살펴보세요.
그럼 이만.

삽질의 대마왕...

익명 사용자의 이미지

Quote:

"warning; passing arg 1 of 'strcpy'from incompatible pointer type.."

고치신 후의 소스코드를 다시 한번 올려주시길 바랍니다.

kimjkr21의 이미지

char ls_do(int cmd_type)
{
struct dirent *item;
char temp_buf[1000];
DIR *dp;
struct stat st;
cmd type=2;
int return_stat;

dp=opendir("./");
if(dp!=NULL)
{
while(item=readdir(dp))
{
strcat(temp_buf,item->d_name);
printf("(1) %s",item->d_name); //=> 실행결과 디렉토리 및 파일 이름 출력됨.
if(strcmp(item->d_name,".")==0 || strcmp(item->d_name,"..")==0) continue;

if(cmd_type==2)
{
return_stat=lstat(item->d_name,&st);
perror("return_stat"); //=> return stat: illegal seek 에러 출력 후 실행 멈춤..!!
if(return_stat!=-1)
{
strcat(temp_buf,(char*)item->d_ino);
printf("(2) item ino; %s",(char*) item->d_ino);
}
}
}
}
}

위 경고부분을 해결하고 나서 디렉토리 파일의 정보를 나타낼때의 소스부분을 올렸습니다., 주석부분을 친 부분을 보신것처럼, 각 라인별로 실행된 결과를 확인할수 있었습니다. lstat() 에 관하여 실행 도중 "illegal seek" 이라는 에러 메시지를 확인할수 있었는데, 여기저기 찾아봐도, 보통 이렇게 다써도 문제없이 출력이 되는거같은데, 저같은 경우엔 이런 에러 메시지만 뜨고 그 파일 정보의 출력이 안되는군요..음. lstat부분에서 문제가 있는것 같은데, 문법적으론 이상이 없는거같아 보여서요..혹시 다른 문제가 있을까요?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.