구조체 포인터 질문인데

바이러스의 이미지

/********************구조체를 이용한 성적 프로그램************
		학생수10명에 대한 국어,영어,수학 성적을 받는다
**************************************************************/

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

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

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

	memeset(pStr->name,0,sizeof(char));
	memeset(pStr->number,0,sizeof(int));

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

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

아직 포인터 개념이 확실히 안서서 그런데 소스보시고 지적 바랍니다

좀더 간단히 하거나 빠진 부분있으면 체크해주세요

수고하세요

정태영의 이미지

/********************구조체를 이용한 성적 프로그램************
      학생수10명에 대한 국어,영어,수학 성적을 받는다
**************************************************************/

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

/* struct _student식으로 쓰실 계획이 없으시다면 이런식으로 하셔도 됩니다. */
typedef struct {
   /* 이부분 왜 포인터 배열을 쓰셨는지 잘 모르겠군요.. */
   char *name[10];
   int *number[3];
}Student;

void main()
{
   Student *pStu;
   for(int i=0;i<10;i++)
   {
   /* 10명의 자료를 받아야 하는데 이렇게 하면 한명분밖에 못받습니다.. sizeof(Student)*10 식으로 하시거나 배열로 하시는게 좋을 듯 싶습니다..*/
   pStu=(Student *)malloc(sizeof(Student));
    
   /* 여기서.. 1바이트를 할당했습니다.. */
   pStu->name=(char *)malloc(sizeof(char));
   pStu->number(int *)malloc(sizeof(int));

   memeset(pStr->name,0,sizeof(char));
   memeset(pStr->number,0,sizeof(int));

   /* 여기서.. 두가지 문제가 있습니다..
    * 1. pStu->name 자체로 메모리 주소값을 가지고 있는데..
    *   다시 주소연산자를 사용했으므로.. pStu->name 의 주소값을가집니다
    * 2. 위에 주석 달았듯이 1바이트를 할당했으므로 1번의 오류가 없더라도
    *    무조건 버퍼오버플로우가 일어나게 됩니다.. "1"은 1바이트가 아닌 2바이트를 사용하거든요
    */
   scanf("%s",&pStu->name);
    /* 이런식으로 쓰실라면 구조체에서 *number[3]이 아닌 number[3]으로
     * 선언하셨어야 합니다 또한 j값은 변화가 없으니 계속 값을 받겠군요..
     * 무한룹에 덤으로 같은 메모리 공간에 값만 계속 바뀔 듯 합니다..
     */
      for(int j=0;j<3;i++)
      {
      /* 이것도 마찬가지구요 :) number[3]으로 선언하셔야 했을 듯 하네요.. 또한 이렇게 하면 같은 곳에 세번 값을 받겠군요.. */
      scanf("%d\",&pStu->number);
      }
   pStu++;
   
   }
   /* 여기서부터 출력이군요.. Student는.. 자료형이지 변수가 아닙니다 위에서처럼 저렇게 pStu++를 사용하시고 싶으시면 pStu-=10; 식으로 하셨어야 합니다. */
   pStu=Student;

   for(int i=0;i<10;i++)
   {
   printf("%s",pStu->name);

      for(int j=0;j<3;i++)
      {
      /* 같은 값 세번 출력하겠군요.. 또한 int j=0 이런식으로 for안에서 사용하는건 좋은 방법도 아니고 언제나 컴파일에 성공하는게 아닙니다.. gcc버젼에 따라 될때도 있고 안될때도 있을겁니다.. 덤으로 i++가 아니라 j++가 되야 맞았을 듯 합니다.. */
      printf("%s",pStu->number);
      }
   pStu++;
   
   }

   /* 여기도 마찬가지로 문제네요 */
   pStu=Student;
   for(int i=0;i<10;i++)
   {
   free(pStu->number);
   free(pStu->name);
   free(pStu->pStr);
        pStu++;
   }
}

돌아간다고 해도 버퍼오버플로우가 무조건 일어나고
세그폴트를 구경하실 수 있으실 듯 =3=33

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

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

confide의 이미지

sakai83 wrote:
typedef struct _student{
	char *name[10];
	int *number[3];
}Student;

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

	...;

	pStu++;
	
	}

}

개념이 좀 안 서신게 분명한듯 합니다.

먼저 구조체에서는
char *name[10];
int *number[3];
포인터의 배열이 되나요? 배열로 쓰시려고 선언한듯 한데... 구태여 앞에 *를 붙여서 강조(?)하실 필요는 없겠죠. 따라서 아래쪽에서도 메모리를 할당해(malloc)줄 필요가 없겠죠?

두번째로
Student *pStu;
for(int i=0;i<10;i++)
{
pStu++;
}

상당히 납득이 안가는 부분입니다. :) 저런식으로 코드를 작성하시면.. 음음! 할당되지 않은 영역을 엑세스 하는것이 되겠죠. 음.. pStu에 Strudent만큼의 메모리를 할당하였지만, 그 뒷부분까지 메모리를 할당해준것은 아니니까요. Linked list라던가 이부분에서 차라리 포인터 배열을 쓰심이.. ;; 어떨런지요.

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

정태영의 이미지

/********************구조체를 이용한 성적 프로그램************
  학생수10명에 대한 국어,영어,수학 성적을 받는다
 **************************************************************/

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

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

int main()
{
	Student pStu[10];
	int i, j;

	for( i = 0 ; i < 10 ; i++ )
	{

		memeset( pStu[i].name, 0, sizeof(pStu[i].name) );
		scanf( "%s", pStu[i].name);

		for( j = 0 ; j < 3 ; j++ )
			scanf( " %d", &pStu[i].number[j] );

	}

	for( i = 0 ; i < 10 ; i++ )
	{
		printf( "%s", pStu[i].name );

		for( j = 0 ; j < 3 ; j++ )
			printf("%s",pStu[i].number[j]);
		
	}
	
}

정상적으로 돌아가게 하려면 이런식으로 하셔야 합니다..
고치면서 보니까.. 중간중간 무슨 생각으로 하셨는지 대강
이해할거 같긴 했는데..

테스트도 안해보신것과..-_-;;
잘못된 발상이 보이더군요..

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

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

바이러스의 이미지

음 malloc할당한 이유는 동적으로
메모리 할당을 할려고 했습니다

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

<==요부분은 제가 잘못적었군요 지적감사합니다
Student *pStu[10]; <==이런식으로
포인터를 잡으면 안되나요?

사람이 죽은뒤에 영혼이라는 것이 과연 존재 할까?죽음으로써 해답을 찾아보자...

confide의 이미지

sakai83 wrote:
음 malloc할당한 이유는 동적으로
메모리 할당을 할려고 했습니다

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

<==요부분은 제가 잘못적었군요 지적감사합니다
Student *pStu[10]; <==이런식으로
포인터를 잡으면 안되나요?

만들기 나름 아니겠어요?

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

댓글 달기

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