【发布时间】:2016-09-29 22:11:53
【问题描述】:
我在这里得到了这个小程序,它带有预先分配的“计数”数字,然后将其解析为“xxx”的格式,其中 x 是 0 或相应的密码(例如,从 '6' 我得到 006 和从234 我得到 234)。当我得到它的时候
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
int count = 0;
char number[2] = {0};
int base0 = count % 10;
int base1 = ((count % 100) - base0) / 10;
int base2 = ((count % 1000) - base1) / 100;
sprintf(number, "%d%d%d", base2, base1, base0); //print into the number variable
printf("%s\n", number);
}
一切正常,但如果我用
切换“数字”变量定义char* number = NULL;
我得到分段错误。这是为什么?它应该只是指向字符串的开头。
【问题讨论】:
-
两者都是非法的并导致UB。你应该学习内存分配。
-
在第一种情况下 (number[2] = {0}),您将 ASCII 字符零分配给数组“number”的每个元素。当您将 NULL 分配给 number 时,您只有一个指向名为“number”的字符的指针,该字符不指向内存地址。您必须为数字分配内存。
-
我现在明白了。但是如何为此分配足够的内存呢? char *number = malloc(sizeof(999));有效,但 sizeof(999) 部分似乎不是最优雅的方式
-
sizeof(999)与sizeof(int)相同......这不是它的工作原理。 -
那么我该如何优化它以仅为 0-999 分配内存?不是整个 int 范围?