2017-02-27 46 views
-1

我試圖掌握指針的想法,但無法得到它的掛鉤。爲什麼此代碼將正確的值分配給s,但是當我嘗試在t上使用它時創建運行時錯誤。字符*錯誤訪問錯誤

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

int main(void) 
{ 
    char *s; 
    char *t; 

    printf("s: "); 
    scanf("%s", s); 

    printf("t: "); 
    scanf("%s", t); 

    return 0; 
} 
+7

您還沒有分配的任何內存 –

+0

我將如何正確地分配內存?我試過這個。 char * s = malloc(20 * sizeof(char)); char * t = malloc(20 * sizeof(char)); –

+1

請閱讀c書或教程。 – kaylum

回答

1

你已經爲你的char指針動態地分配內存,否則它將無法工作。未初始化的指針有垃圾。

//a macro to hold the size of the array. 

#define DIM 12 

char *s = malloc(sizeof(char) * DIM); 
char *t = malloc(sizeof(char) * DIM); 

printf("s: "); 
scanf("%s", s); 

printf("t: "); 
scanf("%s", t); 

當你完成它的時候,不要忘記從堆中釋放內存。

free(t); 
free(s); 

如果你不希望在堆上分配內存,那麼你可以使用它與scanf使用後,你不必釋放字符數組:

char t[DIM]; 
char s[DIM]; 
+0

@MDXF感謝您的編輯 –

1

哪一本書是你讀?這似乎很奇怪,你的書會不會教你這樣的事情...

指針的想法是,他們允許功能,如scanf分配給它們指向的對象(因此而得名,指針趨向到指向的東西)。但是,像其他變量一樣,您需要將它們初始化爲

假設你有一個函數add_one這更增加了它的參數:

void add_one(int x) { 
    x++; 
} 

該功能是沒用的,因爲它使以x的變化是不可見的來電,由於被稱爲通概念按值其中副本傳遞進來的價值,最終被修改(所以原始保持不變)。

您需要製作x指針才能使該更改在add_one以外可見,並且scanf需要進行相同的更改。

void add_one(int *x) { 
    (*x)++; // equivalent to x[0]++; 
} 

當然,這是不行的,如果x實際上並不指向的東西!在你的例子中,你有沒有初始化的指針變量;他們指着......什麼都沒有?什麼?誰在乎? 讓他們指向某個地方!

你可以這樣做:

  • 一個變量使用&地址運算符。例如:

    int x; 
    int *pointer_to_x = &x; 
    
  • 聲明的陣列,以及使用該陣列的標識,可能與+加法運算符結合在陣列中的一個元素到另一個點。例如:

    int array[42]; 
    int *pointer_to_first = array + 0; 
    int *pointer_to_second = array + 1; 
    
  • 調用mallocrealloccalloc或指針返回到合適尺寸的物體的一些其它功能。例如:

    int *pointer_to_whatever = malloc(sizeof *pointer_to_whatever); 
    // Remember to free(pointer_to_whatever) ONCE when you're done with it