【问题标题】:C malloc stringC malloc 字符串
【发布时间】:2015-12-07 19:55:03
【问题描述】:

我正在尝试在我的 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;
}

这是我初始化并将元素推入数组的主要 sn-p

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]);

    }

Initializing array

After running the push function

【问题讨论】:

    标签: c arrays pointers malloc dynamic-arrays


    【解决方案1】:

    不清楚 OP 如何确定“它插入垃圾数据”。由于 malloc() 不会初始化分配数据的内容,因此请确保根据需要设置数据。

    将字段 array 视为字符串是一个问题,因为 array 不是以空字符结尾的。

    将循环更改为&lt;= 以同时推送'\0'

    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] = '\0';
    }
    
    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] = '\0';
    }
    

    【讨论】:

      【解决方案2】:

      malloc() 不会将垃圾“放入”分配的内存中,它只是不会将其初始化为任何东西,因此您会得到那里的任何“垃圾”。您可以使用memset() 来清除内存,也可以使用calloc() 来清除内存。

      【讨论】:

      • 有没有办法覆盖内容,比如 a->array="" ?
      • 不,那不是内存复制,而是指针分配。如果您希望分配的内存表示 C 字符串,请将第一个元素设置为 0,a-&gt;array[0] = '\0';
      【解决方案3】:

      Malloc 只是给你一个指向内存中某个位置的指针,它的内容将是上次某个进程使用它时剩下的任何内容。如果你需要初始化分配内存的内容,你应该使用calloc而不是malloc。

      【讨论】:

        猜你喜欢
        • 2016-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-06
        • 2017-03-29
        • 1970-01-01
        • 2013-11-12
        • 2018-10-10
        相关资源
        最近更新 更多