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 를 동적 으로 조정 하여 공간 을 분배 하기 때문에 이러한 유형의 배열 은 스 택 에서 만 정의 할 수 있 고 데이터 세그먼트 (전체 배열, 정적 배열) 에서 정의 할 수 없습니다.?의문 이 연구 중이 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Docker를 사용한 React 및 .NET Core 6.0 샘플 프로젝트 - 1부이 기사에서는 Entity Framework Core Code First 접근 방식을 사용하는 ASP.NET Core 6.0 WEP API의 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업에 대해 설명합니다. 웹 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.