2011-09-12 34 views
0

我有這個簡單的程序,需要知道應該在哪個基礎上選擇變量(howToPredectThisNumber)(即char*字符串的大小)。如何確定我的char *所需的內存量?

在這種情況下最好選擇char[]char*

#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; 
} 
+0

您有近90個問題沒有被接受的答案。也許你可以看看你給的答案,看看是否可以接受。 –

回答

4

我想你應該延遲那個扣除,直到你知道你想要複製的內容:

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

我同意。另外,儘管@sharptooth沒有明確指出,但在這裏使用'malloc'而不是'calloc'就可以了。如果你想使用'calloc',你的第二個參數應該是'sizeof(char)'而不是'sizeof(char *)'。當然'無論如何'sizeof(char)'被定義爲1。 – Vicky

+2

個人而言,對於calloc,我總是使用'​​ * x = calloc(len,sizeof(* x));'它避免了混淆,並且允許將來容易地更改。 –

0

我會用三分球少,使用的strdup代替的malloc + strlen的+的strcpy因爲那是什麼對於。

更好的解決方案是認識到Emp不適用於名稱並確保在創建時提供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); 
} 
相關問題