Linux c 의 가 변 긴 배열

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

static char arry_b[0];

void lengthen_arry(int n)
{
    const char *head = "headstr-";
    const char *tail = "tailstr";

    char arr[n+1];
    char vla[strlen(head) + strlen(tail) + 1];

    int i;

    strcpy(vla, head);
    strcat(vla, tail);

    printf("%s
", vla); for(i = 0; i < 5; ++i) { char foo[i + 2]; strncpy(foo, "xxxxxxxxxxx", i + 1); foo[i + 1] = '\0'; printf("%s
", foo); } bzero(arr, (n+1) * sizeof(char)); for (i = 0; i < n; i++) { arr[i] = (char)('A' + i); arry_b[i] = (char)('A' + i); } arr[n] = '\0'; arry_b[n] = '\0'; printf("length_arry:%s:%s
", arr, arry_b); } typedef struct _t { size_t size; char *s; }s_t; void lengthen_arry_2(char *str) { s_t *t; t = (s_t *)malloc(sizeof (s_t) + strlen(str)); t->size = strlen(str); t->s = (char *)t + sizeof(s_t); strncpy(t->s, str, t->size); printf("s_t:%s
", t->s); free(t); // } int main(int argc, char *argv[]) { lengthen_arry(6); lengthen_arry_2("lengthen_arry"); return 0; }

위 코드 의 장단 점 을 보 세 요!
/*=============*/
C99 에 긴 배열 에 대한 지원 이 새로 추가 되 었 습 니 다. 즉, 배열 의 길 이 는 비 const 변수 로 정의 할 수 있 습 니 다.
가 변 배열 의 공간 크기 는 프로그램 이 실 행 될 때 까지 확인 할 수 있 기 때문에 프로그램 이 실 행 될 때 만 공간 을 분배 할 수 있 습 니 다.
gcc 컴 파일 러 프로그램 이 실 행 될 때 실제 지정 한 크기 (변수 현재 값) 에 따라 esp 의 값 을 조절 하여 배열 이 스 택 에 적당 한 크기 의 공간 을 분배 합 니 다.
실행 할 때 만 배열 에 공간 을 분배 할 수 있 기 때문에 공간 을 분배 하기 전에 공간의 크기 가 확실 하지 않 기 때문에 분배 공간의 시작 주소 도 확실 하지 않다 (예 를 들 어 스 택 에 두 개의 가 변 긴 배열 을 분배 해 야 하 는 경우).
이후 코드 에서 가 변 긴 배열 의 내용 을 참조 하기 위해 서 는 프로그램 이 가 변 긴 배열 의 주 소 를 어떤 방식 으로 가 져 와 야 합 니 다.
gcc 컴 파일 러 에 서 는 ebp 에 비해 고정된 오프셋 스 택 에 분 배 된 고정 크기 의 영역 (내부 벡터 라 고 함) 에서 가 변 긴 배열 의 정 보 를 기록 합 니 다. 예 를 들 어 배열 의 시작 주소 등 입 니 다.
후계 코드 는 내부 상황 벡터 의 시작 주 소 를 통 해 가 변 긴 배열 에 접근 합 니 다.
배열 은 프로그램 이 실 행 될 때 esp 를 동적 으로 조정 하여 공간 을 분배 하기 때문에 이러한 유형의 배열 은 스 택 에서 만 정의 할 수 있 고 데이터 세그먼트 (전체 배열, 정적 배열) 에서 정의 할 수 없습니다.?의문 이 연구 중이 다.

좋은 웹페이지 즐겨찾기