C中指针变量何时需要初始化malloc
C中定义:char*p,*np;temp[10];strcpy(temp,"abcdef");...p=temp;使用np=strtok(p,"");...请问这里有问题...
C中定义:char *p, *np;
temp[10];
strcpy(temp, "abc def");
...
p = temp;
使用np = strtok(p, " ");
...
请问这里有问题么?为什么此处对于p或np就不用malloc分配个空间?谢谢指点!
是否需要为每个声明的char*指针变量先赋个初值,例如char *p = NULL;? 展开
temp[10];
strcpy(temp, "abc def");
...
p = temp;
使用np = strtok(p, " ");
...
请问这里有问题么?为什么此处对于p或np就不用malloc分配个空间?谢谢指点!
是否需要为每个声明的char*指针变量先赋个初值,例如char *p = NULL;? 展开
10个回答
展开全部
首先你要明白什么是指针,指针是用来操作内存的。那么指针又如何操作内存呢?在C语言里可以定义指针变量,这个指针变量里可以存储内存的地址,一个32位的无符号整型值。它就像普通的int, double型变量一样。以下面为例说明:
int iMax = 1;
int * pMax = NULL;
我们定义了一个int型的变量iMax 和一个int型的指针变量pMax,并对他们进行了初始化。这里iMax的值为1; pMax的值为NULL,也就是一个无符号整形0。注意NULL是一个宏,代表0。现在pMax的值为NULL,一般来讲0也是一块内存地址, 我们也可以操作。注意这个NULL你现在认为他表示无效即可。用来给指针进行初始化。其它的先不用管。
现在我们来使用pMax, 如果要使用pMax, 那么就要对pMax赋值,使它指向一块内存。我们这里定义指针的类型为一个指向一个int型值的指针变量。所以可以将iMax的地址赋值给pMax。注意,不管什么样的类型的指针变量,其值都是一个unsigned int型的值,表示内存的地址。理解这一点很重要。为什么需要定义指针所指向的类型呢。如 char *, int * , double *型的指针,原因是我们使用指针是为了操作存储在内存中的特定类型的值。如果没有定义指针的类型,那我们在操作内存时,只能一个字节, 一个字节使用。这样的指针没有什么意义,也许你还不太理解。但多应用就能明白这一点。
现在我们来给pMax赋值,然后操作它.
pMax = &iMax;
好了,可以使用pMax了。就像使用iMax一样用它。不过你得在它前面加个指针运算符'*';
*pMax = *pMax + 2;
现在的pMax指针变量中存储的是iMax变量地址的值。对*pMax操作, 就是对iMax操作。现在*pMax = 3 , iMax = 3;
如果说我临时需要一块内存,这块内存用来存储n个int的变量。我就需要使用malloc为pMax分配一块内存。可以这样做:
pMax = malloc(sizeof(int) * n);
if (pMax == NULL) // 错误处理
{ TODO...}
这样我们就为pMax分配了一块内存大小为sizeof(int) *n 字节的内存。这里malloc返回一个指向这块内存的首地址并将它赋给了int型指针变量pMax.
好了,pMax已经可以使用了。我们需要对它进行初始化。这个可以使用memset函数
memset(pMax, 0 , sizeof(int) * n);
现在就可以像数组一样操作这块int型的内存了。
pMax[0] = iMax;
pMax[1] = iMax + 1;
pMax[2] = pMax[0];
...
总的来说,指针非常灵活。因为它可以直接操作内存。这就会使指针这个东西很不容易控制。
像你说的p = temp ;将数组的首地址赋值给p , 这样只是为了更容易操作字符串。temp也表示字符串的首地址, 但他是一个不可改变的量,即不能对temp赋值,它是只读的。指针p就不同了,他可以进行一些数学运算。
对一个程序来讲,如果你临时需要一块内存来存储数据,你可以使用malloc, 但记得要free。否则容易造成内存泄露。
就这些吧。 希望对你有用。写这么多也不容易,给点分吧。^_^
int iMax = 1;
int * pMax = NULL;
我们定义了一个int型的变量iMax 和一个int型的指针变量pMax,并对他们进行了初始化。这里iMax的值为1; pMax的值为NULL,也就是一个无符号整形0。注意NULL是一个宏,代表0。现在pMax的值为NULL,一般来讲0也是一块内存地址, 我们也可以操作。注意这个NULL你现在认为他表示无效即可。用来给指针进行初始化。其它的先不用管。
现在我们来使用pMax, 如果要使用pMax, 那么就要对pMax赋值,使它指向一块内存。我们这里定义指针的类型为一个指向一个int型值的指针变量。所以可以将iMax的地址赋值给pMax。注意,不管什么样的类型的指针变量,其值都是一个unsigned int型的值,表示内存的地址。理解这一点很重要。为什么需要定义指针所指向的类型呢。如 char *, int * , double *型的指针,原因是我们使用指针是为了操作存储在内存中的特定类型的值。如果没有定义指针的类型,那我们在操作内存时,只能一个字节, 一个字节使用。这样的指针没有什么意义,也许你还不太理解。但多应用就能明白这一点。
现在我们来给pMax赋值,然后操作它.
pMax = &iMax;
好了,可以使用pMax了。就像使用iMax一样用它。不过你得在它前面加个指针运算符'*';
*pMax = *pMax + 2;
现在的pMax指针变量中存储的是iMax变量地址的值。对*pMax操作, 就是对iMax操作。现在*pMax = 3 , iMax = 3;
如果说我临时需要一块内存,这块内存用来存储n个int的变量。我就需要使用malloc为pMax分配一块内存。可以这样做:
pMax = malloc(sizeof(int) * n);
if (pMax == NULL) // 错误处理
{ TODO...}
这样我们就为pMax分配了一块内存大小为sizeof(int) *n 字节的内存。这里malloc返回一个指向这块内存的首地址并将它赋给了int型指针变量pMax.
好了,pMax已经可以使用了。我们需要对它进行初始化。这个可以使用memset函数
memset(pMax, 0 , sizeof(int) * n);
现在就可以像数组一样操作这块int型的内存了。
pMax[0] = iMax;
pMax[1] = iMax + 1;
pMax[2] = pMax[0];
...
总的来说,指针非常灵活。因为它可以直接操作内存。这就会使指针这个东西很不容易控制。
像你说的p = temp ;将数组的首地址赋值给p , 这样只是为了更容易操作字符串。temp也表示字符串的首地址, 但他是一个不可改变的量,即不能对temp赋值,它是只读的。指针p就不同了,他可以进行一些数学运算。
对一个程序来讲,如果你临时需要一块内存来存储数据,你可以使用malloc, 但记得要free。否则容易造成内存泄露。
就这些吧。 希望对你有用。写这么多也不容易,给点分吧。^_^
推荐于2016-07-25
展开全部
指针是用来操作内存的。
C语言的内存模型包含有栈和堆两部分。
栈存放的是函数执行时的变量等,这部分变量由系统自动管理,比如 int a;等,这些变量在函数体结束时自动收回。
堆存放的是由用户自己手动管理的变量,这些变量是的由malloc函数建立,由 free函数释放。不会在函数体结束时自动收回。
C语言的内存模型包含有栈和堆两部分。
栈存放的是函数执行时的变量等,这部分变量由系统自动管理,比如 int a;等,这些变量在函数体结束时自动收回。
堆存放的是由用户自己手动管理的变量,这些变量是的由malloc函数建立,由 free函数释放。不会在函数体结束时自动收回。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先对指针要有个明确的理解,声明出来的指针变量,要先初始化,要不使用过程中就会出现错误,那是因为声明后的指针变量是指向了内存中随机的一个位置,指向某些重要数据的地址或是正在使用中的程序的地址无从得知。如果不初始化直接如*p = XXXX;就是强行改变该内存中的数据那是肯定出错的。
所以一定要给变量初始化。MALLOC就是令系统给该变量分配一可用的内存空间地址给指针,而用指针指向数组就是用数组的地址给指针初始化,这里跟MALLOC分配地址是一个道理。
所以一定要给变量初始化。MALLOC就是令系统给该变量分配一可用的内存空间地址给指针,而用指针指向数组就是用数组的地址给指针初始化,这里跟MALLOC分配地址是一个道理。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
个人认为
char *p;
此时p指针已经分别分配了一个内存空间,这个空间大小等于指针大小,不同位数的机器上有所不同(64位机器指针大小为8字节);此时这个空间就只能存储一个8字节的值,所以你可以把temp复制给它。
至于何时需要申明malloc来分配内存空间,这就要看你需要存储的值大小了,假如你需要存储10个char型的值,一个char占一个字节所以预先内存大小不够了,就需要
p = (char *)malloc(10*sizeof(char));
p[0] = ?;
p[1] = ?;
......
当然了如果有一个现成指向10个char型的指针s,直接p = s就行了。
char *p;
此时p指针已经分别分配了一个内存空间,这个空间大小等于指针大小,不同位数的机器上有所不同(64位机器指针大小为8字节);此时这个空间就只能存储一个8字节的值,所以你可以把temp复制给它。
至于何时需要申明malloc来分配内存空间,这就要看你需要存储的值大小了,假如你需要存储10个char型的值,一个char占一个字节所以预先内存大小不够了,就需要
p = (char *)malloc(10*sizeof(char));
p[0] = ?;
p[1] = ?;
......
当然了如果有一个现成指向10个char型的指针s,直接p = s就行了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-05-04
展开全部
1.
struct item
{
char *name;
...
其中name作为字符串其长度未定义,虽然符合语法(指针本身就没有要求定义长度的)。对于这种未赋初值的字符串,需要定义一个有长度的数组。
改成char name[20];
我明白楼主的意思,是想定义一个长度不固定的字串,但是这是C,pchar类型的并不是严格意义上的串,建议使用C++中的string类型,可以不定义长度。
2.
scanf/printf在字符串引用时应使用指针形式,所以应该是check.name
另外,团IDC网上有许多产品团购,便宜有口碑
struct item
{
char *name;
...
其中name作为字符串其长度未定义,虽然符合语法(指针本身就没有要求定义长度的)。对于这种未赋初值的字符串,需要定义一个有长度的数组。
改成char name[20];
我明白楼主的意思,是想定义一个长度不固定的字串,但是这是C,pchar类型的并不是严格意义上的串,建议使用C++中的string类型,可以不定义长度。
2.
scanf/printf在字符串引用时应使用指针形式,所以应该是check.name
另外,团IDC网上有许多产品团购,便宜有口碑
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询