【问题标题】:C programming pointers and array [duplicate]C编程指针和数组[重复]
【发布时间】:2019-08-19 10:27:51
【问题描述】:
#include<stdio.h>

int main()
{
  //int *a={5641,5,98};
  char *s="this is a character array";
  printf("%s",s);
}

这种初始化数组的方法对字符数组有效,但对整数数组无效,请告诉我为什么..?

【问题讨论】:

  • int a[] = { ... }; 怎么样?
  • 试试这个int a[] = { 5641, 5, 98};
  • 阅读this

标签: c arrays string pointers initialization


【解决方案1】:

对于程序中的初学者,s 不是数组。它是一个指针。

char *s="this is a character array";

所以指针s是由字符串文字"this is a character array"的第一个字符的地址初始化的,它确实是一个字符数组的类型。

在 C 中,您可以使用复合文字来初始化指向数组第一个元素的指针。

例如

#include <stdio.h>

int main(void) 
{
    enum { N = 5 };
    int *p = ( int[N] ) { 1, 2, 3, 4, 5 };

    for ( size_t i = 0; i < N; i++ ) printf( "%d ", p[i] );
    putchar( '\n' );

    return 0;
}

【讨论】:

  • 在超出范围之前您不需要致电free() 吗?
  • @Robur_131 不,你不需要,因为数组不是动态分配的。
  • 还是因为没有关联的malloc()
  • @Robur_131 复合文字具有自动存储持续时间,因为它是在函数体中定义的。
  • @Robur_131 正如我已经写过的那样,您无法做到这一点。要么定义一个变量来保持数组的大小,要么在数组中使用一个标记值。
【解决方案2】:
    #include<stdio.h> 

int main() 
{ 
  int arr[5] = { 1, 2, 3, 4, 5 }; 
  int *ptr = arr; 

  printf("%p\n", ptr); 
  return 0; 
}

【讨论】:

  • 需要解释
【解决方案3】:

如果要静态初始化数组,请使用注释中提到的int a[] = { ... } 形式。以下是这样做的方法:

#include<stdio.h>

int main()
{

    int a[] = { 5641, 5, 98};

    char const *s = "this is a character array";
    printf("%s\n",s);

    int arrayLength = sizeof(a) / sizeof(a[0]);
    int i = 0;
    printf("Array length is %d\n", arrayLength);
    for(; i < arrayLength ; ++i){
        printf("%d ", a[i]);
    }
    printf("\n");
}

如果你想动态分配驻留在堆内存中的数组,那么你可以这样做:

#include <stdio.h>
#include <stdlib.h>

int main()
{

    //int a[] = { 5641, 5, 98};
    int arrayLength = 3;
    int *a = (int*) malloc( (arrayLength + 1) * sizeof(a));
    a[0] = 5641;
    a[1] = 5;
    a[2] = 98;

    char const *s = "this is a character array";
    printf("%s\n",s);

    int i = 0;
    printf("Array length is %d\n", arrayLength);
    for(; i < arrayLength ; ++i){
        printf("%d ", a[i]);
    }
    printf("\n");
    free(a);
}

你必须调用malloc() 在堆中分配内存。数组处理完后调用free(),否则会导致内存泄漏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2021-08-11
    • 2019-04-13
    • 2021-11-08
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多