字符*错误访问错误

时间:2017-02-27 00:03:18

标签: c pointers c-strings

我正在尝试掌握指针的想法但却无法掌握它。为什么此代码会为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;
}

2 个答案:

答案 0 :(得分: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数组:

char t[DIM];
char s[DIM];

答案 1 :(得分: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实际上并没有指出某些内容,那么这项工作就不会奏效!在您的示例中,您已获得未初始化的指针变量;他们指着......什么都没有?什么?谁在乎? 让他们指向某个地方!

您可以通过以下方式执行此操作:

  • 在变量上使用& address-of运算符。例如:

    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