2014-01-26 49 views
-2

我正在學習使用C中的指針,我正在測試如何在malloc之後寫入一個char?以下是我的代碼,但它不起作用。我在尋找一些幫助:C編程:如何寫malloc後的char?

#include <stdio.h> 
#define SIZECHAR 10 // write 10 char starting from the first position of malloc 

int main(void) 
{ 
//  char *charArray = (char *)malloc(SIZECHAR * sizeof(char)); 

     char *charArray = "helloworld"; // this is a temporary pointer 

     while (*charArray != '\0') 
     { 
       int *currentIndex = (int *) charArray++; 
       printf("the current pointer is %i\n", *currentIndex); // print out the current pointer 
     } 

     return 0; 
} 

您的幫助是非常感謝。

+2

你的問題很不清楚。該主題詢問「在malloc之後」做了什麼,但調用malloc()的代碼行已被註釋掉。什麼**正確**是你在這裏問的問題?我們不知道「它不工作」是什麼意思,而你是這樣做的。 (如果你沒有,你不會在這裏發佈。)什麼**特別**不起作用?你要求我們幫助你解決什麼*實際問題? –

+1

「這不工作」不是很豐富;你應該說你的期望和它與你得到的不同。事實上,你的代碼有幾個錯誤,它不會調用malloc。請發佈符合問題的代碼,並且v.v. –

+0

你想在這裏獲得什麼? – motiur

回答

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

#define SIZECHAR 10 

int main(void) { 
     //create array for 10 characters plus null terminator 
     char *charArray = malloc((SIZECHAR + 1) * sizeof(char));  

     //fill array with digits 
     int i; 
     for(i = 0; i < SIZECHAR; i++) { 
      charArray[i] = (char)('0' + i % 10); 
     } 
     //add null terminator to indicate the end of the string 
     charArray[SIZECHAR] = '\0'; 

     //print the string, plus a newline 
     printf("%s\n", charArray); 

     return 0; 
} 
+1

a)你應該說這是做什麼的。 b)您的數組不是NUL終止的,因此使用%s打印的結果是未定義的行爲。 c)你不用換行符終止輸出。 d)你沒有解決OP代碼中的錯誤,例如僞造的數據,打印出一個int而不是一個指針,與評論相反。 –

+0

@JimBalter,感謝您的幫助! –

+0

更好。你用'0'到'9'來填充數組,而不是0到10.另外,請參閱我的要點(d)。 –

1

遺憾的是目前還不清楚。我想是這樣的:例如,malloc的 分配內存從位置開始10000300 - 10000310.我 要字符串「的HelloWorld」寫入該段的內存, 從1000030.

這確實開始是(除了你的關於地址錯字):

char str[] = "helloworld"; 
char* mem = malloc(strlen(str) + 1); 
if (!mem) ReportOutOfMemoryAndExit(); 
strcpy(mem, str); 

您還可以,如果你知道這個代碼將在支持它運行的系統使用的替代的strdup的malloc和strcpy。

要做到這一點「手動」,更換strcopy呼叫與

for (char *from = str, *to = mem; (*to++ = *from++) != 0;) { } 

你發佈的代碼的一些注意事項:

//  char *charArray = (char *)malloc(SIZECHAR * sizeof(char)); 

不要強制轉換malloc的返回值 - 它是不需要的,它可以隱藏錯誤(即,如果不包含聲明malloc的頭文件)。此外,sizeof(char)始終爲1,因此不需要。如果你想指定的通用數據類型的大小,這是更好地寫成

char* array = malloc(ARRAY_SIZE * sizeof *array); 

將繼續,如果你改變數組類型的工作。

​​

這裏沒有理由來投射指針。每個演員陣容都是「代碼味道」,而你已經有兩個陣容。另外,指針不是索引。

  printf("the current pointer is %i\n", *currentIndex); // print out the current pointer 

這不打印的指針,它打印的int ......在int指向你的charArray轉換爲int*。這是未定義的行爲,因爲不能保證char指針可以被當作一個int指針來處理......在某些體系結構中,您會遇到對齊錯誤。

如果你想打印的地址被存儲在哪裏字符,

while (*charArray != '\0') 
    { 
      printf("the current pointer is %p\n", charArray++); // print out the current pointer 
    } 

會做到這一點。

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

#define SIZECHAR 10 

int main(void){ 
    char *charArray = malloc((SIZECHAR+1) * sizeof(char));//+1 for terminator '\0',, 
    char *p = strcpy(charArray, "helloworld");//write(copy) malloced addres; 

    printf("top of address : %p\n", (void*)charArray); 

    while (*p != '\0'){ 
     printf("the current pointer is %p(%c)\n", (void*)p, *p); 
     ++p; 
    } 

    return 0; 
}