C 포인터 질문요

skylandi의 이미지

#include <stdio.h>

int main()
{
	char munja;
	char *buf;

	munja='a';
	buf=(char *)munja;
	buf++;
	munja='b';
	buf=(char *)munja;
	printf("%s",buf); // 여기 부분에 에러가
	return 0;
}

환경은 비주얼 C++ 6.0인데요
저 부분이 에러가 나는데 제가 잘못 생각한건지요
comeddy의 이미지

#include <stdio.h>
#incude <string.h>

int main()
{
	char munja;
	char *buf;

	munja = 'a';
	buf = (char *)& munja;

	if (strcmp(buf, (char *)&buf[0]) == 0 ) {	// 같은 문자인가?? 
		printf("same character\n");
	}

	buf[1] = '\0';
	printf("buf: %s\n", buf);

	return 0;
}

초심으로

sangwoo의 이미지

일단은 문자열 끝에 NULL이 없어서 에러가 나는 것일텐데..
원하시는 결과가 뭔가요? ab를 출력하는 건가요?

----
Let's shut up and code.

익명 사용자의 이미지

skylandi wrote:
	munja='b';
	buf=(char *)munja;

위의 코드를 다르게 쓰면

	munja=98;
	buf=(char *)munja;

이 되겠죠? 따라서 buf=98이 됩니다. 윈도에서 98번지는 접근 금지 구역에 있으므로 printf("%s", buf)하면 세그폴트가 발생할 겁니다. 에러가 안나게 하려면

	munja=98;
	buf=&munja;

으로 하면 되지만, 이것도 역시 buf가 널로 끝나지 않기 때문에 b 다음에 쓰레기 문자들이 아무렇게나 나오게 됩니다.
익명 사용자의 이미지

comeddy wrote:
	if (strcmp(buf, (char *)&buf[0]) == 0 ) {	// 같은 문자인가?? 
		printf("same character\n");
	}

strcmp()는 문자열을 비교할 때 사용하는 함수입니다. 문자열 != 문자. 그리고 buf와 &buf[0]는 언제나 같습니다.

kis2u의 이미지

munja란 변수에 'a' 값을 넣고,
포인터 buf로 munja 변수를 가리키도록 한 후에,
포인터 buf 가리키는 곳의 값을 증가시켜서 'b'가 되도록 한 후,
그 값을 출력해 보려고 하신건 아닌지.. ^^;
뒤에 munja 변수를 'b'로 다시 대입하고 buf가 가리키게 한 것은 디버깅용으로.. (혼자 상상.. -.-;)

맞다면 포인터를 다음과 같이 사용하시면 됩니다.

#include <stdio.h>

int main()
{
        char munja;
        char *buf;

        munja='a';
        buf = &munja
        (*buf)++;

        printf("%c\n", *buf);
        return 0;
}

맨 페이지에 보면, printf 에서 specifier? %s는 NUL 문자열이 나올 때까지 출력을 하도록 되어 있다고 하는군요.. %c로 출력하시면 int형을 unsigned char 값으로 변환하여, 그에 해당하는 문자를 출력하게 됩니다..

그리고, 포인터 buf의 메모리 할당 없이

buf[1] = '\0';

위와 같이 지정해서 사용하는 것은 위험의 소지가 있지 않을까요??

Dr_stein의 이미지

Quote:
포인터 buf 가리키는 곳의 값을 증가시켜서 'b'가 되도록 한 후,

a다음에 b를 넣어서 정확하진 않지만, 제가 보기에는 포인터를 증가해서 거기에 b를 넣으려는 의도를 보이는데... -_-;

어쨌던 선언한땐 어드레스가 올거라고 하고, 접근이 금지된 주소를 넣은뒤,
접근하려 해서 생기는 거네여...

앞마당 먹고 시작한 저그의 8할은 뮤탈 테크를 먼저 탄다. 하지만 나머지 2할때문에 항상 스켄이 모자란다. - _-;

고물의 이미지

#include <stdio.h> 

int main() 
{ 
   char munja; 
   char *buf; 

   munja='a'; 
   buf=(char *)munja; // char형인 munja의 주소를 넣은게 아니면서 그 형을 (char *)로 정의를 해서 cast 연산으로 에러출력을 시키지 않습니다. 이 경우에는 어떻게 되는지 확실하지 않습니다. 다만 이론대로 해석을 하면 munja의 내용을 가지고 address화시키는 것인데 munja가 ascii로 'a'라는 97번 코드를 넣었기 때문에 97번인 메모리 adress를 buf가 가리키게 되는? 올바른 값을 얻기 위해서 buf=&munja로 하시는게 나을듯..
   buf++; 
   munja='b'; 
   buf=(char *)munja; // 이것두 위와 같음
   printf("%s",buf); // buf가 string 형이기 때문에 출력하는데는 이상이 없습니다만 buf가 가리키는 곳의 주소가 위에처럼 98번의 절대 영역을 침범하게 되는데 그러면 kernel 상에서 그 주소를 processor가 가져갈 수 있느냐는? 그리고 원하는 것이 해킹인지 모르겠으나, 올바른 값을 얻기 위해서는 printf("%c",*buf);라구 하시는게 맞을듯..
   return 0; 
} 

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.