C malloc 字符串
C malloc string
我正在尝试为我的 C 堆栈实现一个动态数组,但是我对 char malloc 的工作方式有点困惑,以至于它在创建后立即插入垃圾数据。
下面是用于初始化数组和压入元素的代码。
typedef struct {
char *array;
int used;
int size;
} Array;
void initArray(Array *a, int initialSize) {
a->array = (char *)malloc(initialSize * sizeof(char)+1);
a->used = 0;
a->size = initialSize;
}
void pushArray(Array *a, int element) {
if (a->used == a->size) {
a->size +=1;
a->array = (char *)realloc(a->array, a->size * sizeof(char));
}
a->array[a->used++] = element;
}
这是我初始化元素并将元素推入数组的主要片段
int main()
{
Array a;
int i=0;
initArray(&a,0);
char choice='a';
char exp[100]="";
printf("Please enter an expression\n");
scanf("%s",exp);
for (i=0;i<strlen(exp);i++){
pushArray(&a,exp[i]);
}
malloc()
不会 "put" 分配内存中的垃圾,它只是不会将其初始化为任何东西,所以你得到任何 "garbage" 在那里。您可以使用 memset()
来清除内存,也可以使用 calloc()
来清除内存。
不清楚 OP 如何确定 "it inserts garbage data"。由于 ``malloc()` 没有初始化分配数据的内容,确保数据按需要设置。
将字段 array
作为字符串查看是一个问题,因为 array
不是空字符终止的。
将循环更改为 <=
以同时推送 '[=15=]'
。
for (i=0;i<=strlen(exp);i++){
pushArray(&a,exp[i]);
}
或者在每次推送时附加空字符。注意:几乎不需要 * sizeof(char)
和转换 *alloc()
的 return 值
void initArray(Array *a, int initialSize) {
a->array = malloc(initialSize + 1);
a->used = 0;
a->size = initialSize;
a->array[0] = '[=11=]';
}
void pushArray(Array *a, int element) {
if (a->used == a->size) {
a->size +=1;
a->array = realloc(a->array, a->size + 1);
}
a->array[a->used++] = element;
a->array[a->used] = '[=11=]';
}
Malloc 只是给你一个指向内存中某个位置的指针,它的内容将是上次某个进程使用它时剩下的任何内容。如果需要初始化分配内存的内容,应该使用calloc而不是malloc。
我正在尝试为我的 C 堆栈实现一个动态数组,但是我对 char malloc 的工作方式有点困惑,以至于它在创建后立即插入垃圾数据。
下面是用于初始化数组和压入元素的代码。
typedef struct {
char *array;
int used;
int size;
} Array;
void initArray(Array *a, int initialSize) {
a->array = (char *)malloc(initialSize * sizeof(char)+1);
a->used = 0;
a->size = initialSize;
}
void pushArray(Array *a, int element) {
if (a->used == a->size) {
a->size +=1;
a->array = (char *)realloc(a->array, a->size * sizeof(char));
}
a->array[a->used++] = element;
}
这是我初始化元素并将元素推入数组的主要片段
int main()
{
Array a;
int i=0;
initArray(&a,0);
char choice='a';
char exp[100]="";
printf("Please enter an expression\n");
scanf("%s",exp);
for (i=0;i<strlen(exp);i++){
pushArray(&a,exp[i]);
}
malloc()
不会 "put" 分配内存中的垃圾,它只是不会将其初始化为任何东西,所以你得到任何 "garbage" 在那里。您可以使用 memset()
来清除内存,也可以使用 calloc()
来清除内存。
不清楚 OP 如何确定 "it inserts garbage data"。由于 ``malloc()` 没有初始化分配数据的内容,确保数据按需要设置。
将字段 array
作为字符串查看是一个问题,因为 array
不是空字符终止的。
将循环更改为 <=
以同时推送 '[=15=]'
。
for (i=0;i<=strlen(exp);i++){
pushArray(&a,exp[i]);
}
或者在每次推送时附加空字符。注意:几乎不需要 * sizeof(char)
和转换 *alloc()
void initArray(Array *a, int initialSize) {
a->array = malloc(initialSize + 1);
a->used = 0;
a->size = initialSize;
a->array[0] = '[=11=]';
}
void pushArray(Array *a, int element) {
if (a->used == a->size) {
a->size +=1;
a->array = realloc(a->array, a->size + 1);
}
a->array[a->used++] = element;
a->array[a->used] = '[=11=]';
}
Malloc 只是给你一个指向内存中某个位置的指针,它的内容将是上次某个进程使用它时剩下的任何内容。如果需要初始化分配内存的内容,应该使用calloc而不是malloc。