argv[n]가 쓰기 가능합니까?
C115.1.2.2.1/2는 다음을 의미합니다.
변수 개 변
argc
그리고.argv
▁the▁pointed끈▁to▁strings로 가리키는 줄.argv
배열은 프로그램에 의해 수정 가능해야 하며, 프로그램 시작과 프로그램 종료 사이에 마지막 순서 값을 유지해야 합니다.
이것에 대한 제 해석은 다음과 같습니다.
int main(int argc, char **argv)
{
if ( argv[0][0] )
argv[0][0] = 'x'; // OK
char *q;
argv = &q; // OK
}
그러나 다음과 같은 내용은 없습니다.
int main(int argc, char **argv)
{
char buf[20];
argv[0] = buf;
}
아이즈argv[0] = buf;
허용되나요?
저는 (적어도) 두 가지 가능한 주장을 볼 수 있습니다.
- 위의 인용구는 의도적으로 언급된 것입니다.
argv
그리고.argv[x][y]
하지만 아닙니다.argv[x]
할 수 없다는 이었습니다. argv
는 non-syslog 포인터입니다.const
객체, 따라서 반대의 구체적인 표현이 없는 경우, 우리는 그것들이 수정 가능한 객체라고 가정해야 합니다.
와 같은 , 코드종류argv[1] = "123";
UB은 UB(원본사용원))argv
).
""는 다음과 같습니다
argc
그리고.argv
▁the▁pointed끈▁to▁strings로 가리키는 줄.argv
배열은 프로그램에 의해 수정될 수 있어야 하며, 프로그램 시작과 프로그램 종료 사이에 마지막으로 저장된 값을 유지해야 합니다." C11dr & C17dr1 § 5.1.2.2.12
을 하시오.const
C가 만들어진 지 여러 해 후에 C에 들어왔습니다.
의거와 매우 합니다.char *s = "abc";
그래야 할 때 유효합니다.const char *s = "abc";
의 const
. 그렇지 것입니다. 그렇지 않았다면 너무 많은 기존 코드가 의 도입으로 깨졌을 것입니다.const
.
가지로찬마설라도, 사▁if,.argv
오늘은 고려되어야 합니다.char * const argv[]
아면다서있는이명른니가 있는 다른 .const
의 const
에 시대에char *argv[]
에서는 완히지지않다습니를 지정하지 않습니다.const
-ness 니즈argv
,argv[]
또는argv[][]
.const
-ness 요구는 사양에 따라 결정되어야 합니다.
내가 읽은 바로는, 스펙은 이슈에 대해 침묵하고 있지만, 다른 과제에 대해서는 깊이 들어가 있기 때문입니다.main()
의argv =
그리고.argv[i][j] =
UB입니다.
정의되지 않은 행동은 이 국제 표준에서 "정의되지 않은 행동"이라는 단어 또는 행동의 명시적 정의의 생략으로 표시됩니다." § 42
[편집]:
main()
는 C 에매특기능다니입별한우는에서 입니다.은 른다기서허것는은다용음허허않있에서 허용될 수도 있고 되지 않을 .main()
C 명 을 특 대 합 니 에 변 수 개 제 공 한 ▁the 니 다int argc, char *argv[]
그럴 필요가 없습니다.main()
, 에서는 서명 C의 다 함 달 대 서 명 수 있 습 니 다 가 질 을 른 체 수 리와를 가질 수 .int main(void)
그리고 잠재적으로 다른 사람들.main()
재입국이 아닙니다.C 사양은 수정할 수 있는 항목을 자세히 설명합니다.argc
,argv
,argv[][]
의문을 제기하는 것이 타당합니다.argv[]
코드가 할 수 있다고 주장하는 규격에서 누락되었기 때문에 수정할 수 있습니다.
고때할려의 할 때.main()
그리고 그것을 명시하는 것의 생략.argv[]
보수적인 프로그래머는 이 회색을 UB로 취급하여 향후 C 사양을 명확히 할 때까지 처리할 수 있습니다.
한다면argv[i]
플랫폼에서 하며, 주진플에수가며하능정, 확히범는의 입니다.i
초해서안됩니를 초과해서는 안 .argc-1
.
"로서argv[argc]
포인터가 함 null 포터되어함야할당", 인가를 합니다.argv[argc]
이외의 것으로NULL
위반으로 보입니다.
문자열은 수정할 수 있지만 코드는 원래 문자열의 길이를 초과하면 안 됩니다.
char *newstr = "abc";
if (strlen(newstr) <= strlen(argv[1]))
strcpy(argv[1], newstr);
1 C17/18에 변경 사항 없음.그 버전은 많은 것을 명확히 하기 위한 것이었기 때문에, 이 규격은 적절하고 누락되지 않았습니다.argv
배열 요소는 수정 가능해야 합니다."
그argv
어레이를 수정할 필요는 없지만 실제 구현에서는 가능할 수 있습니다.이것은 1998년 n849 회의에서 재확인된 의도적인 표현입니다.
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n849.htm
PUBLIC REVIEW COMMENT #7
[...]
Comment 10.
Category: Request for information/clarification
Committee Draft subsection: 5.1.2.2.1
Title: argc/argv modifiability, part 2
Detailed description:
Is the array of pointers to char pointed to by argv modifiable?
Response Code: Q
This is currently implictly unspecified and the committee
has chosen to leave it that way.
또한, 두 개의 별도 제안이 각각 문구를 변경하고 확대했습니다.둘 다 거절당했습니다.관심 있는 독자는 "argv"를 검색하여 찾을 수 있습니다.
트리비아: 커니헌과 리치의 예시 C 프로그래밍 언어의 두 번째 단("K&R2")은 이에 위배됩니다.117페이지에 있으며 관련 코드 행은 다음과 같습니다.
while (c = *++argv[0])
이 명령은 문자열의 문자를 통과하도록 인수 벡터 자체 내부의 포인터를 증가시킵니다.
argc
냥그입니다.int
제한 없이 수정할 수 있습니다.
argv
는 수정 가능한 수정수있입니다.char **
은 는뜻입다니라는 뜻입니다.argv[i] = x
유효합니다.하지만 그것은 아무 것도 말하지 않습니다.argv[i]
그 자체를 수정할 수 있습니다. 그래서.argv[i][j] = c
정의되지 않은 동작으로 이어집니다.
그getopt
C 표준 라이브러리의 함수는 argc와 argv를 수정하지만 실제 char 배열은 수정하지 않습니다.
정답은 argv가 배열이고 네, 그 내용은 수정 가능합니다.
키는 동일한 섹션의 앞부분에 있습니다.
argc의 값이 0보다 클 경우 array members argv[0] ~ argv[argc-1] include는 문자열에 대한 포인터를 포함해야 하며, 이는 프로그램 시작 전에 호스트 환경에 의해 구현 정의 값이 지정됩니다.
이로부터 argv가 특정 길이(argc)의 배열로 생각되는 것이 분명합니다.그러면 *argv는 포인터로 감쇠된 해당 배열에 대한 포인터입니다.
이 맥락에서 읽으십시오. 'argv는 수정 가능해야 합니다...그리고 그 내용을 유지'는 배열의 내용을 수정할 수 있도록 명확하게 의도합니다.
저는 특히 argc가 수정될 경우 발생할 수 있는 일에 대해 문구에 약간의 모호성이 남아 있다는 것을 인정합니다.
제 말은 제가 이 언어를 의미하는 것으로 읽었다는 것입니다.
[Argv [array]의 내용과 Argv 배열이 가리키는 문자열은 수정 가능해야 합니다...
따라서 배열의 포인터와 이들이 가리키는 문자열은 모두 읽기-쓰기 메모리에 있으며, 변경해도 손상되지 않으며 프로그램의 수명 동안 값을 보존합니다.저는 이 동작이 예외 없이 모든 주요 C/C++ 런타임 라이브러리 구현에서 발견될 것이라고 예상합니다.UB가 아닙니다.
모호함은 argc에 대한 언급입니다.argc(단순히 로컬 함수 매개변수로 보이는)의 값을 변경할 수 없는 어떤 목적이나 구현을 상상하기 어려운데, 왜 그것을 언급합니까?표준은 함수가 매개변수의 값을 변경할 수 있다고 분명히 명시하고 있는데, 왜 이 점에서 argc를 특별히 취급합니까?argv에 대한 이러한 우려를 촉발시킨 것은 argc에 대한 이 예상치 못한 언급이며, 그렇지 않으면 언급 없이 지나갈 것입니다.문장에서 argc를 삭제하면 모호함이 사라집니다.
라고 분명히 언급되어 있습니다.argv
그리고.argv[x][x]
수정할 수 있습니다. 만약에.argv
수정 가능한 경우 배열의 다른 첫 번째 요소를 가리킬 수 있습니다.char
그므로러.argv[x]
다른 문자열의 첫 번째 요소를 가리킬 수 있습니다.으로 궁적으로극▁ult.argv[x]
또한 수정이 가능하며, 표준에서 명시적으로 언급할 필요가 없는 이유가 될 수 있습니다.
언급URL : https://stackoverflow.com/questions/25737434/is-argvn-writable
'programing' 카테고리의 다른 글
비즈니스 계층에 EJB3 또는 Spring을 사용해야 합니까? (0) | 2023.09.06 |
---|---|
MYSQL에서 문자열의 일부를 삭제하는 중 (0) | 2023.09.01 |
시드 가능한 JavaScript 난수 생성기 (0) | 2023.09.01 |
Powershell 비위치, (0) | 2023.09.01 |
로드 시 색상이 지정된 이미지에 잘못된 색상을 부여하는 CV 열기 (0) | 2023.09.01 |