字符*错误访问错误
我试图掌握指针的想法,但无法得到它的挂钩。为什么此代码将正确的值分配给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;
}
你已经为你的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];
@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;
-
调用
malloc
,realloc
,calloc
或指针返回到合适尺寸的物体的一些其它功能。例如:int *pointer_to_whatever = malloc(sizeof *pointer_to_whatever); // Remember to free(pointer_to_whatever) ONCE when you're done with it
您还没有分配的任何内存 –
我将如何正确地分配内存?我试过这个。 char * s = malloc(20 * sizeof(char)); char * t = malloc(20 * sizeof(char)); –
请阅读c书或教程。 – kaylum