2011-09-12 5 views
0

私はこの簡単なプログラムを持っており、変数(howToPredectThisNumber)(つまり、char*文字列のサイズ)のために、どの基準を選択する必要があるかを知る必要があります。私のchar *に必要なメモリの量を調べる方法は?

この場合、どちらを選択するのがベストですか?char[]またはchar* ??

void setName(Emp* emp, char* newName) 
{ 
    free(emp->name); 
    emp->name = malloc(strlen(newName) + 1); 
    strcpy(emp->name, newName); 
} 
+0

あなたは受け入れられた回答なしでほぼ​​90の質問があります。おそらくあなたは、受け入れられたかどうかを確認するために与えられた答えを見ることができます。 –

答えて

4

は、私はあなたがコピーしたいものを知っているまで、あなたはその控除を遅らせる必要がありますねために。

より良い解決策は、Empが名前で有効でないことを認識し、作成時に提供されていることを確認することです。名前を指定するのを忘れた場合、実行時にセグメンテーション違反が発生するのではなく、コンパイルされません。

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

typedef struct { 
    char* name; 
} Emp; 

Emp *create(char * name) { 
    Emp *emp = (Emp *) malloc(sizeof (Emp)); 
    emp->name = strdup(name); 
    return emp; 
} 

void release(Emp* emp) { 
    free(emp->name); 
    free(emp); 
} 

void setName(Emp* emp, char* newName) { 
    free(emp->name); 
    emp->name = strdup(newName); 
} 

char* getName(Emp* emp) { 
    return emp->name; 
} 

int main(int argc, char** argv) { 
    Emp* emp = create("Muhammad   Abdullah"); 
    printf("%s", getName(emp)); 
    release(emp); 

    return (EXIT_SUCCESS); 
} 
+1

私は同意します。また、@sharptoothは明示的にそれを指摘していませんが、ここでは 'calloc'ではなく' malloc'を使用しても問題ありません。 'calloc'を使いたい場合、2番目のパラメータは' sizeof(char *) 'ではなく' sizeof(char) 'でなければなりません。もちろん、 'sizeof(char)'はとにかく1になるように定義されています。 – Vicky

+2

個人的に、私はいつも ' * x = calloc(len、sizeof(* x)); 'それは混乱を避け、容易にの変更を可能にする。 –

0

が、私はあまりのポインタを使用してのstrdup代わりにmalloc + strlenを+にstrcpyを使用することになり、それが何であるかthatsのよう:

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

typedef struct 
{ 
    char* name; 
}Emp; 

void init(Emp** emp) 
{ 
    int howToPredectThisNumber = 50; 
    *emp = malloc(sizeof(Emp)); 
    (*emp)->name = NULL; 
    (*emp)->name = calloc(howToPredectThisNumber, sizeof(char*)); 
} 

void release(Emp** emp) 
{ 
    free((*emp)->name); 
    free(*emp); 
} 

void setName(Emp* emp, char* newName) 
{ 
    strcpy(emp->name, newName); 
} 
char* getName(Emp* emp) 
{ 
    return emp->name; 
} 

int main(void) 
{ 
    Emp* emp; 
    init(&emp); 
    setName(emp, "Muhammad   Abdullah"); 
    printf("%s", getName(emp)); 
    release(&emp); 

    return 0; 
} 
関連する問題