2011-02-24 48 views
3

如果我的字符串在此程序中超過9個字符,我不應該得到一個錯誤嗎?如何在C中使用calloc()?

// CString.c 
// 2.22.11 

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

main() 
{ 
    char *aString = calloc(10, sizeof(char)); 

    if (aString == NULL) 
    { 
     return 1; 
    } 

    printf("PLEASE ENTER A WORD: "); 
    scanf("%s", aString); 

    printf("YOU TYPED IN: %s\n", aString); 
    //printf("STRING LENGTH: %i\n", strlen(aString)); 
} 

感謝

blargman

+0

你傳遞的是什麼scanf是一個指針..和C運行時間不包含任何關於分配指針大小的信息......它可能會保存該數據..但它是標準C程序無法訪問的......你可能能夠使用堆內省功能獲得可用大小) – vrdhn 2011-02-24 04:05:40

回答

6

因爲語法是正確的你不會得到一個編譯錯誤。什麼是不正確的是邏輯,你得到的是未定義的行爲,因爲你正在寫入緩衝區末尾的內存。

爲什麼它是未定義的行爲?那麼,你沒有分配那個意味着它不屬於你的內存 - 你正在進入一個被警告磁帶關閉的區域。考慮你的程序是否在緩衝區之後直接使用內存。您現在已經覆蓋了該內存,因爲您已經覆蓋了緩衝區。

考慮使用尺寸說明是這樣的:

scanf("%9s", aString); 

所以你不要溢出的緩衝區。

+2

@blargman:**未定義的行爲意味着** ***任何*** **都可能發生**。這包括允許你的程序工作。它還包括崩潰你的電腦,導致你的手機爆炸,停止地球的旋轉並將希特勒帶回生活。換句話說,「未定義的行爲」意味着「不能保證這會按照你想要的方式工作。」你不能依賴未定義的行爲來持續地給你預期的行爲。 – 2011-02-24 04:06:48

+0

@blargman:對於您的程序將執行什麼不保證。現在發生的事情是,你正在寫給你沒有正確分配的內存。任何事情都可能發生,從完美的工作到程序崩潰。 – 2011-02-24 04:07:43

+1

那麼,這是一個緩衝區溢出的實例嗎? – nambvarun 2011-02-24 04:14:29