为什么当将整数添加到字符串时,打印它时不会显示?下面是代码:
char *newStr = NULL;
char *backedUpPtr = NULL;
newStr = (char *) malloc ((4) * sizeof(char));
backedUpPtr = newStr;
*newStr = 'a';
newStr++;
*newStr = 4;
printf("%s", backedupPtr);
打印这个时,数字4不会出现。为什么呢?我需要将其转换为字符吗?如果有,怎么做?
首先,您没有用NUL字符结束字符串(因此从技术上讲,它不是 C字符串)。从malloc
返回的内存包含任意字节,不一定是零。
换句话说,这段代码可能会给你带来麻烦,因为你没有正确地终止字符串——printf
可能会因此崩溃成一个尖叫的堆。
在此之上,您正在存储代码点4
,这是ASCII
中的CTRL-D。如果你想要一个可打印的 4
,你需要使用'4'
。
而且,虽然我们列出了一长串的问题,但变量backedUpPtr
和backedupPtr
之间存在巨大差异(即u
的资本化),释放分配的内存是很好的形式,并且您不应该在C中转换malloc
的返回值,它可能导致某些微妙的错误。此外,乘以sizeof(char)
是不必要的,因为它总是 1。
底线,我将从这段代码开始,然后从那里继续:
#include <stdio.h>
#include <stdlib.h>
int main (void) {
char *newStr = NULL;
char *backedUpPtr = NULL;
newStr = malloc (4); // no need for cast or multiply
if (newStr == NULL) { // and ALWAYS check
printf ("No memory availablen");
return 1;
}
backedUpPtr = newStr;
*newStr = 'a'; // store the a
newStr++;
*newStr = '4'; // store the character 4
newStr++;
*newStr = ' '; // make into C string
printf ("%s", backedUpPtr);
free (backedUpPtr); // also good form
return 0;
}
,尽管它可以写得更简单:
#include <stdio.h>
#include <stdlib.h>
int main (void) {
char *newStr = malloc (4);
char *backedUpPtr = newStr;
if (newStr == NULL) {
printf ("No memory availablen");
return 1;
}
*newStr++ = 'a';
*newStr++ = '4';
*newStr = ' ';
printf("%s", backedUpPtr);
free (backedUpPtr);
return 0;
}
或者,因为四个字节是相当小的数量,所以根本没有真正需要使用malloc
(除了可能教你如何动态内存分配):
#include <stdio.h>
int main (void) {
char backedUpPtr[4], *newStr = backedUpPtr;
*newStr++ = 'a';
*newStr++ = '4';
*newStr = ' ';
printf("%s", backedUpPtr);
return 0;
}
或者,更简单一点,虽然不那么有教育意义:-)
#include <stdio.h>
int main (void) {
printf ("a4");
return 0;
}