字符*错误访问错误

问题描述:

我试图掌握指针的想法,但无法得到它的挂钩。为什么此代码将正确的值分配给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

你已经为你的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感谢您的编辑 –

哪一本书是你读?这似乎很奇怪,你的书会不会教你这样的事情...

指针的想法是,他们允许功能,如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