标题:char *pS[NUM_P]={NULL}这条代码不算初始化?
只看楼主
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
得分:0 
4楼讲理论,9楼讲实践,左三圈右三圈动动手再问嘛

梦想拥有一台龙芯3A-4000
2014-08-29 17:50
lanskyxti
Rank: 1
等 级:新手上路
帖 子:14
专家分:4
注 册:2014-8-29
得分:0 
回复 9 楼 bccn250
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stddef.h>
//#define BUFFER_LEN 128
#define NUM_P 100
const size_t BUFFER_LEN=128;
//const size_t NUM_P=100;   //为什么改成define申明就可以,两个应该是一个意思啊??? 

int main(void)
{
    char buffer[BUFFER_LEN];
    char *pS[NUM_P]={NULL};
    char *pbuffer=buffer;
    int i=0;
    printf("\nYou can enter up to %u message each up to %u characters",NUM_P,BUFFER_LEN-1);
   
    for(i=0;i<NUM_P;i++)
    {
       pbuffer=buffer;
       printf("\nEnter %s message,or press Enter to end\n",i>0?"another":"a");
       while((pbuffer-buffer<BUFFER_LEN-1)&&((*pbuffer++=getchar())!='\n'));
       if((pbuffer-buffer)<2)
       break;
       if((pbuffer-buffer)==BUFFER_LEN && *(pbuffer-1)!='\n')
          {
             printf("String too long -maximum %d characters allowed.",BUFFER_LEN);
             i--;
             continue;
          }
       *(pbuffer-1)='\0';
       pS[i]=(char*)malloc(pbuffer-buffer);
       if(pS[i]==NULL)
       {
         printf("\nOut of menory - ending program.");
         return 1;
       }
       strcpy(pS[i],buffer);
    }
       printf("\nIn reverse order,the strings you entered are:\n");
       while(--i >=0)
       {
          printf("\n%s",pS[i]);
          free(pS[i]);
          pS[i]=NULL;
       }
       system("pause");
       return 0;
}
     
2014-08-29 17:56
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
以下是引用lanskyxti在2014-8-29 17:20:41的发言:

大哥,我是C初学者,不要嫌弃我问的问题小白,弄不明白会困扰我很久的,麻烦再解答下。
你说C99 解说:可以被初始化的,要么是未知长度的数组 要么是非可变长度的数组
开始我初始了NUM_P //const size_t NUM_P=100,那么*pS[NUM_P]={NULL}这个属于非可变长的数组等价于*pS[100]={NULL},要么属于未知长度数组

我不高兴是因为你没看我说的话 当然你说看不懂 我可以给你讲

C99属于比较新的东西 VC还不支持呢

一般数组的定义 要么数组的长度是给定的 要么是可以计算出来的 两个例子

int a[5] = {0};
char str[] = "aaa";


对于第一种情况 因为这个5是写在里面的 属于硬编码 容易造成错误 而C99之前又不支持数组的长度是变量 所以 一般用宏来实现 比如

程序代码:
#define N 5
...
int a[N] = {0};

这也是上面一个人回复的 如果你的编译器不支持C99 只能用这种方法

对于第二种情况 因为字符串aaa的长度是3 所以 str的长度是4(包括结尾的0)

这两种情况都是可初始化的 但对于变长数组 也就是数组的长度是一个变量 比如const size_t NUM_P=100; 根据规范是不能初始化的 所以 你初始化就错了 如果你非要给它填充数 用下面这种方法
程序代码:
#include <stdio.h>
#include <memory.h>

int main(void)
{
    const size_t a = 9;
    int right[a];
    // int wrong[a] = {0};
    memset(right, 0, a * sizeof(int));
    return 0;
}

其实就是初始化了

不知道你还有啥问题
2014-08-29 18:02
lanskyxti
Rank: 1
等 级:新手上路
帖 子:14
专家分:4
注 册:2014-8-29
得分:0 
回复 13 楼 zklhp
谢谢,你详细的解答。原来const size_t NUM_P=100,定义的是变量NUM_P的值固定是100,NUM_P始终是变量,所以*pS[NUM_P]={NULL}无法初始化,即变量的指针无法初始化。对于我们自学者,一个问题解决不了很容易造成下面的看不下去,如果没有人解答的话,自己看着看着就循环死了。再次谢谢你的解答,希望下次有问题可以找你回答!
2014-08-29 21:54
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:3 
以下是引用lanskyxti在2014-8-29 21:54:20的发言:

谢谢,你详细的解答。原来const size_t NUM_P=100,定义的是变量NUM_P的值固定是100,NUM_P始终是变量,所以*pS[NUM_P]={NULL}无法初始化,即变量的指针无法初始化。对于我们自学者,一个问题解决不了很容易造成下面的看不下去,如果没有人解答的话,自己看着看着就循环死了。再次谢谢你的解答,希望下次有问题可以找你回答!

关于C99的特性 因为微软的Visual Studio不支持 所以正常开发中是很少用的

据说VS在最新版的测试版里面加入了更多C99支持 不过谁知道呢

祝楼主学习愉快
2014-08-30 08:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
这是你非要用C编译器的结果,不是什么不支持。

授人以渔,不授人以鱼。
2014-08-30 15:55
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:2 
12.7 我不明白为什么我不能象这样在初始化和数组维度中使用常量: const int n = 5; int a[n];

const 限定词真正的含义是 ``只读的"; 用它限定的对象是运行时 (同常)  不能被赋值的对象。因此用 const 限定的对象的值并 不完全是一个真正的常量。 在这点上 C 和 C++ 不一样。如果你需要真正的运行 时常量, 使用预定义宏 #define (或enum)。

参考资料: [ISO, Sec. 6.4]; [H&S, Secs. 7.11.2,7.11.3 pp. 226-7]。

授人以渔,不授人以鱼。
2014-08-31 23:10
erty1001
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:331
专家分:1433
注 册:2014-8-31
得分:0 
char *pS[NUM_P]={NULL}

这条语句 有的编译器 只能帮你初始化第一个指针,剩余的指针不能被初始化 。
2014-09-01 07:02



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-435475-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.054918 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved