밑에 구조체 소스 수정판입니다(답변달아주셨던 분들도 보세요 ^

바이러스의 이미지

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

typedef struct _student{
	char name[10];
	int number[3];
}Student;

void main()
{
	int i,j;
	Student *pStu[10],*p;
	pStu=(Student *)malloc(sizeof(Student)*10);
	p=pStu;
	for(int i=0;i<10;i++)
	{
	pStu->name=(char *)malloc(80);
	pStu->number(int *)malloc(80);

	memeset(pStu->name,0,sizeof(pStu->name));
	memeset(pStu->number,0,sizeof(pStu->number));

	scanf("%s",&pStu[i]->name);
		for(j=0;j<3;j++)
		{
		scanf("%d\",&pStu[i]->number[j]);
		}
	p=p+1;
	
	}
	p=pStu;
	for(i=0;i<10;i++)
	{
	printf("%s",pStu[i]->name);

		for(j=0;j<3;j++)
		{
		printf("%s",pStu[j]->number);
		}
	p=p+1;
	
	}
	p=pStu;
	for(int i=0;i<10;i++)
	{
	free(pStu[i]->number);
	free(pStu[i]->name);
	p=p+1;
	}
	free(pStu);
}

여기서

	pStu->name=(char *)malloc(80);
	pStu->number(int *)malloc(80);

	memeset(pStu->name,0,sizeof(pStu->name));
	memeset(pStu->number,0,sizeof(pStu->number));

그 malloc을 해준이유는 동적메모리 할당땜시 했구요
만약 pStu->name=(char *)malloc(80);해주면 80바이트를 쓸수있다는 말입니까 그리고 sizeof(pStu->name)이게 정형화된 memeset인지 궁금하군요

다시 부족하거나 지적사항을 알려주시면 감사하겠습니다

alsong의 이미지

char name[10];
int number[3];
-> char* name;
int * number;
로 바뀌어야 됩니다.

Student *pStu[10],*p;
pStu=(Student *)malloc(sizeof(Student)*10);
의도한 방향으로 메모리가 할달 되지 않습니다.
메모리그림을 그려가면서 보면 이해가 되실겁니다.

pStu[i] = (Student*)malloc(sizeof(Student));
이걸 열번 돌리세요.

Quote:
만약 pStu->name=(char *)malloc(80);해주면 80바이트를 쓸수있다는 말입니까

맞습니다.

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

정태영의 이미지

sakai83 wrote:

만약 pStu->name=(char *)malloc(80);해주면 80바이트를 쓸수있다는 말입니까 그리고 sizeof(pStu->name)이게 정형화된 memeset인지 궁금하군

sizeof(pStu->name) 이라고 하면 4가 나올겁니다
name[10]이니까 name은 상수포인터가 되니까요 :) sizeof(char)*10 이 되어야 맞을겁니다..

뭐 사실 pStu->name[0] = '\0';
만 해줘도 잘 돌기는 하니까 별 문제는 없겠네요...

sakai83 wrote:

p=pStu;
for(int i=0;i<10;i++)
{
pStu->name=(char *)malloc(80);
pStu->number(int *)malloc(80);

memeset(pStu->name,0,sizeof(pStu->name));
memeset(pStu->number,0,sizeof(pStu->number));

scanf("%s",&pStu[i]->name);
for(j=0;j<3;j++)
{
scanf("%d\",&pStu[i]->number[j]);
}
p=p+1;

}
p=pStu;

p = p+1;
이나
p=pStu;

같은건.. 저런식으로 pStu[i]같이 접근할 경우엔 구지 사용할 필요가 없습니다..
그리고 pStu[i]식으로 하실려면 -> 가 아니라 . 으로 접근하셔야 합니다..

->는.. (*pStu).number 같은식으로 쓰게 되면 우선순위때문에
가로를 안치거나 하면 좀 헷갈리는 경우도 있고 문제가 생기는 경우도 있기 때문에

그런걸 피하기위해서 사용하는 겁니다..
(*pStu).number 나.. pStu->number는 같은 역할이죠..

그 포인터가 가리키는 곳에 있는 멤버를 뜻하는 말입니다..

scanf("%s",&pStu[i]->name);
흠 이부분에서도 같은 문제가 있고.. &는 사용하지 않아야 합니다..
저렇게 하면 name이라는 포인터의 주소를 넘겨주게 되서.. 버퍼오버플로우가 날 수도 있고 원하는데로 동작하지 않습니다..

저렇게 주소연산자를 구지 사용하고 싶으시다면
scanf("%s",&pStu[i].name[0]); 이 되어야 하고 이건..
scanf("%s",pStu[i].name); 이것과 결과적으로 같은 역할을 합니다..

memset하실때는.. []를 사용하지 않았고.. 또한 pStu는 변화되지
않고 있으므로 계속 같은곳만 초기화하고 있겠군요 저렇게 사용하는 건 맞습니다만..

그 문제는.. p를 증가시키는게 아니라
pStu를 증가시키고..

p=pStu; 가 아니라 pStu=p; 식으로 하시면 해결되는 문젭니다..
컴파일을 한번쯤 해보시고 올리시는게 좋을거 같군요..

적어도 어느정도나 원하는데로 동작하는지..
에러가 어떻게 나는지 ..

워닝이 어떻게 나는지가 익숙해지시는게 앞으로 편하실테니까요..

사실 성의 없어보입니다.. -_-;;

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

confide의 이미지

ddd를 써 보시는게 좋을듯 합니다.

뭐.. gdb 자체에 익숙해 지시는게 더 좋을지도 모르겠습니다만. ^ ^

------------------
나는 바보

댓글 달기

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