c++의 static 변수같은게 c에는 없나요?

cjy1126의 이미지

유해 프로그램을 나타내는 code, name 을 멤버로 가지는 구조체가 있습니다.

이 구조체를 이용해서 유해 프로그램 리스트르 만들었습니다.

agent에 이 리스트를 전송하려고 하는데, 몇개의 리스트를 전할지 리스트의 개수를 보내고 데이터를 전달하려고 합니다.

listCount라는 변수를 따로 잡아야 하나요?

struct process
{
   int code;
   char name[100];
   int listCount;
}

이렇게하자니 listCount 변수는 1개만 필요한데 메모리가 낭비되고, 구조체와 따로해서 잡자니 현재 변수가 너무 많아서요.

가능하면 묶어서 다닐려고 생각하는데, c에서는 별수없나요?

코드가 커지니까 기능하나 붙이는게 너무 힘드네요 ㅜ.ㅜ

hanzo69의 이미지

static 멤버변수는 객체에 묶이는게 아니라 그냥 전역변수일 뿐일텐데요.
뭘 묶는다는건지 모르겠군요.
c++에서 static 멤버로 선언해서

process::listCount = 3;

이렇게 쓰나, c에서 process.c에 전역변수로 선언한 후 헤더에 extern선언하여

process_listCount = 3;

이렇게 이름을 붙여 쓰나.. 별 차이는 없을 듯.. 뭐 느낌은 다르겠지만요.

님ㅎ 즐~

ㅡ,.ㅡ;;의 이미지

질문이 무슨말인지 이해하기 힘들군요.


----------------------------------------------------------------------------

cjy1126의 이미지

class A{
   int code;
   char name[50];
   static int count;
};

이렇게하면 int code;는 객체의 수만큼 메모리에 할당되고, static int count는 객체의 수에 관계없이 한번 할당되는걸로 압니다.

struct B{
   int code;
   char name[50];
   static int count; /* 에러가 납니다. */
};

class처럼 count 변수를 공유할 방법이 없나해서요.

필요한것들끼리 묶어서 관리하고 싶어서요.

프로그램이 커질수록, 함수와 변수 작명... 관리가 힘드네요 ㅠ.ㅠ

icanfly의 이미지

hanzo69님의 답변처럼 그냥 static 변수를 쓰면 되지 않나요?

그리고 코딩한 사람이 그런용도로 static변수를 쓰면 되는거겠죠.

꼭 struct와 묶어야할 이유는 없어보이는데요.

단지 기분상 이란 문제는 있을수있겠지만....

형식에 너무 얽매이지 않는게 좋다고 보여집니다.

progcom의 이미지

변수가 많더라도, 구조체 밖으로 빼야합니다.

그보다도 전,

cjy1126 wrote:
class A{
   int code;
   char name[50];
   static int count;
};

를 이해할 수가 없네요. 처리해야할 코드번호와 이름이 들어있는 객체에 '전체 갯수'를 왜 넣어야하나요?
count가 A클래스 안에 들어가는 이유가 궁금합니다. count 라는 변수는 class A의 집합을 가지고 있는 객체에서 가지고 있어야할 정보 아닌가요?

hanist92의 이미지

제가 잘 이해를 못하는 건지 모르겠는데요...

struct process
{
   int code;
   char name[100];
}

struct processes
{
   process *pProcess;
   int listCount;
}

이렇게 할거 같은데요....

첨으로 글을 올려보는거니까 이상해도 용서를 :oops:

ㅡ,.ㅡ;;의 이미지

cjy1126 wrote:
class A{
   int code;
   char name[50];
   static int count;
};

이렇게하면 int code;는 객체의 수만큼 메모리에 할당되고, static int count는 객체의 수에 관계없이 한번 할당되는걸로 압니다.

struct B{
   int code;
   char name[50];
   static int count; /* 에러가 납니다. */
};

class처럼 count 변수를 공유할 방법이 없나해서요.

필요한것들끼리 묶어서 관리하고 싶어서요.

프로그램이 커질수록, 함수와 변수 작명... 관리가 힘드네요 ㅠ.ㅠ

먼저 그러한 구조라면 count 의 맴버는 구조체의 맴버라고 보기 힘들겠군요.. 따라서 구조체외부로 빼는게더 바람직한구조라고 보아지며.
궂이내부에 두고싶을경우 동일메모리를 공유할것이므로 포인터를쓰면 되겠지요..

그리고 님이 첫글에서 우려하신 클레쓰의경우 메모리가 하나로 공통으로 쓰이나 구조체인경우 구조체갯수만큼 메모리가 낭비된다고 하셨는데.
클레쓰의경우도 장담은못하나 ㅋㅋ 객체생성당시에 어차피특정위치를 기억할 메모리가 할당될것으로보입니다.
따라서 이러나저러나 결국 마찬가지가된다는소리지요..


----------------------------------------------------------------------------

doldori의 이미지

ㅡ,.ㅡ;; wrote:
그리고 님이 첫글에서 우려하신 클레쓰의경우 메모리가 하나로 공통으로 쓰이나 구조체인경우 구조체갯수만큼 메모리가 낭비된다고 하셨는데.
클레쓰의경우도 장담은못하나 ㅋㅋ 객체생성당시에 어차피특정위치를 기억할 메모리가 할당될것으로보입니다.
따라서 이러나저러나 결국 마찬가지가된다는소리지요..

그렇지 않습니다. 클래스 개체는 static 멤버를 기억(?)할 필요가 없고 따라서
이에 필요한 메모리가 할당되지도 않습니다.
죠커의 이미지

일반적인 "블록 내부의 자동 객체"(흔히 말하는 지역 변수)는 클래스 할당과 소멸에 따라 생사를 함께 하겠지만 "블록 내부의 정적 객체"(static)는 "블록 밖의 정적 객체"(흔히 말하는 전역 변수)와 같은 수명 모델을 같습니다.

차이점은 블록에 따라서 그 객체가 다른 코드와 데이터에게 보이게 되는 "범위"(scope)만이 차이가 날 뿐이죠.

댓글 달기

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