char的指针,两种不同的方式一个问题
Pointer of char, two diffrent ways one problem
我有两个不同的字符串声明。
char * Dateiname;
char Dateiname1[LEN_ASCII_TIME];
在第一种情况下,我使用 malloc 分配内存:
if(Dateiname = malloc(sizeof(char)*LEN_ASCII_TIME) == NULL){
perror(NIO_SPEICHER);
}
第二种情况=LEN_ASCII_TIME=25
不需要 malloc 或 calloc。
然后我想使用 time.h 中的 asctime() 将字符串复制到文件名:
strncpy_s(Dateiname,LEN_ASCII_TIME,asctime(sysTimeStruct),LEN_ASCII_TIME-1);
输出案例1:
(null)
如果我使用第二种变体:
strncpy_s(Dateiname1,LEN_ASCII_TIME,asctime(sysTimeStruct),LEN_ASCII_TIME-1);`
输出变量 2:
Tue Mar 23 12:57:51 2021
我的思维错误在哪里?为什么我不能用malloc给charptr *预留和写入内存区域?
长话短说:这是因为你尝试了一个聪明的把戏。如果在 if
之外分配 malloc
的结果,您将得到所需的结果:
Dateiname = malloc(LEN_ASCII_TIME);
if(Dateiname == NULL){
perror(NIO_SPEICHER);
}
您的代码行为不同的原因是赋值 =
的 precedence 低于 ==
,因此 Dateiname
赋值比较 malloc
-ed 指向 NULL
的指针,即 0
.
请注意,sizeof(char)
被标准固定为 1
,因此您永远不需要乘以它。
我有两个不同的字符串声明。
char * Dateiname;
char Dateiname1[LEN_ASCII_TIME];
在第一种情况下,我使用 malloc 分配内存:
if(Dateiname = malloc(sizeof(char)*LEN_ASCII_TIME) == NULL){
perror(NIO_SPEICHER);
}
第二种情况=LEN_ASCII_TIME=25 不需要 malloc 或 calloc。
然后我想使用 time.h 中的 asctime() 将字符串复制到文件名:
strncpy_s(Dateiname,LEN_ASCII_TIME,asctime(sysTimeStruct),LEN_ASCII_TIME-1);
输出案例1:
(null)
如果我使用第二种变体:
strncpy_s(Dateiname1,LEN_ASCII_TIME,asctime(sysTimeStruct),LEN_ASCII_TIME-1);`
输出变量 2:
Tue Mar 23 12:57:51 2021
我的思维错误在哪里?为什么我不能用malloc给charptr *预留和写入内存区域?
长话短说:这是因为你尝试了一个聪明的把戏。如果在 if
之外分配 malloc
的结果,您将得到所需的结果:
Dateiname = malloc(LEN_ASCII_TIME);
if(Dateiname == NULL){
perror(NIO_SPEICHER);
}
您的代码行为不同的原因是赋值 =
的 precedence 低于 ==
,因此 Dateiname
赋值比较 malloc
-ed 指向 NULL
的指针,即 0
.
请注意,sizeof(char)
被标准固定为 1
,因此您永远不需要乘以它。