Вопросы с тегом «c»

C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.

2
Почему адреса argc и argv разделены 12 байтами?
Я запустил на своем компьютере следующую программу (64-разрядная версия Intel под управлением Linux). #include <stdio.h> void test(int argc, char **argv) { printf("[test] Argc Pointer: %p\n", &argc); printf("[test] Argv Pointer: %p\n", &argv); } int main(int argc, char **argv) { printf("Argc Pointer: %p\n", &argc); printf("Argv Pointer: %p\n", &argv); printf("Size of &argc: %lu\n", …

2
Почему переключатель не оптимизирован так же, как цепочка, если еще в c / c ++?
Следующая реализация square производит серию операторов cmp / je, как я и ожидал от цепочки if: int square(int num) { if (num == 0){ return 0; } else if (num == 1){ return 1; } else if (num == 2){ return 4; } else if (num == 3){ return 9; …

6
Почему эта заявка на разыменование предупреждающего указателя типа зависит от компилятора?
Я читал различные сообщения о переполнении стека RE: ошибка разыменовывающего указателя типа. Насколько я понимаю, ошибка, по сути, является предупреждением компилятора об опасности доступа к объекту через указатель другого типа (хотя, похоже, для этого сделано исключение char*), что является понятным и разумным предупреждением. Мой вопрос относится к приведенному ниже коду: …
38 c  pointers  casting 

3
Невозможно передать символ «#» в качестве аргумента командной строки
Я не могу передать строки, начинающиеся с #аргументов командной строки. Вот простой тест: #include <stdio.h> int main(int argc, char *argv[]) { for (int i = 1; i < argc; i++) printf("%s ", argv[i]); putchar('\n'); return 0; } Если я введу аргументы следующим образом: 2 4 # 5 6 Ценность argcесть …

7
Почему я не могу получить доступ к указателю на указатель для массива стека?
Пожалуйста, взгляните на следующий код. Он пытается передать массив как char**функцию: #include <stdio.h> #include <stdlib.h> static void printchar(char **x) { printf("Test: %c\n", (*x)[0]); } int main(int argc, char *argv[]) { char test[256]; char *test2 = malloc(256); test[0] = 'B'; test2[0] = 'A'; printchar(&test2); // works printchar((char **) &test); // crashes …
35 c 

4
Является ли алгоритм strcasecmp некорректным?
Я пытаюсь переопределить strcasecmpфункцию в C, и я заметил несоответствие в процессе сравнения. От man strcmp Функция strcmp () сравнивает две строки s1 и s2. Локаль не учитывается (сравнение с учетом локали смотрите в strcoll (3)). Он возвращает целое число, меньшее, равное или большее нуля, если найдено, что s1 соответственно …
34 c  strcmp 

7
Как работает сравнение указателей в C? Можно ли сравнивать указатели, которые не указывают на один и тот же массив?
В главе 5 K & R (язык программирования C, 2-е издание) я прочитал следующее: Во-первых, указатели могут сравниваться при определенных обстоятельствах. Если pи qуказывают на элементы одного и того же массива, то соотношения нравится ==, !=, <, >=и т.д. работать должным образом. Кажется, это означает, что сравнивать можно только указатели, …

4
Копируются ли потоки при вызове fork?
Если у меня есть программа, работающая с потоками и вызывающая в системе fork()на основе Unix, скопированы ли потоки? Я знаю, что виртуальная память для текущего процесса копируется 1: 1, чтобы новый процесс порождался. Я знаю, что потоки имеют свой собственный стек в виртуальной памяти процесса. Таким образом, хотя бы стек …

6
Как правильно преобразовать 2 байта в 16-разрядное целое число со знаком?
В этом ответе , zwol сделал это заявление: Правильный способ преобразования двух байтов данных из внешнего источника в 16-разрядное целое число со знаком - с помощью вспомогательных функций, таких как: #include <stdint.h> int16_t be16_to_cpu_signed(const uint8_t data[static 2]) { uint32_t val = (((uint32_t)data[0]) << 8) | (((uint32_t)data[1]) << 0); return ((int32_t) …

1
Почему запись постоянно оставляет 4K байтов в буфере?
У меня есть по существу следующий код: int fileWrite(int file, void * pBuffer, size_t size) { size_t bytesWritten = (size_t)write( file, pBuffer, size ) ; if (bytesWritten != size) { return -1; } return 0; } Это работает, если размер составляет 1 ГБ, но когда размер составляет ~ 2 ГБ, …
30 c  linux  system-calls 

4
Как называется (…) в C и C ++?
Одним из применений ...является обозначение переменных элементов в C и C ++. Как это называется? Это классифицируется как оператор или что-то еще, когда используется таким образом? Любые другие детали, касающиеся ...? Изменить: я знаю цель .... Я спрашиваю о его названии и классификации, которые, я надеюсь, похожи как на C, …

2
Почему грамматика BNF в C допускает объявления с пустой последовательностью init-деклараторов?
Просматривая грамматику BNF в C, я подумал, что странно, что производственное правило для объявления выглядит следующим образом (согласно https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of% 20C% 20in% 20Backus-Naur% 20form.htm ): <declaration> ::= {<declaration-specifier>}+ {<init-declarator>}* ; Зачем использовать *квантификатор (имеется в виду ноль или более вхождений) для init-declarator? Это позволяет синтаксически допустимым операторам типа int;или void;быть, даже …

2
Неожиданная оптимизация strlen при совмещении 2-го массива
Вот мой код: #include <string.h> #include <stdio.h> typedef char BUF[8]; typedef struct { BUF b[23]; } S; S s; int main() { int n; memcpy(&s, "1234567812345678", 17); n = strlen((char *)&s.b) / sizeof(BUF); printf("%d\n", n); n = strlen((char *)&s) / sizeof(BUF); printf("%d\n", n); } Использование gcc 8.3.0 или 8.2.1 с …

4
Является ли void * function () указателем на функцию или функцию, возвращающую void *?
Я запутался в значении void *function(). Это указатель на функцию или возвращаемую функцию void*? Я всегда использовал его в структурах данных как рекурсивную функцию, возвращающую указатель, но когда я увидел код в многопоточности ( pthread), было одно и то же объявление функции. Теперь я запутался в чем разница между ними.

3
Есть ли в C эквивалент std :: less из C ++?
Недавно я отвечал на вопрос о неопределенном поведении p < qв C, когда pи qесть указатели на разные объекты / массивы. Это заставило меня задуматься: <в этом случае C ++ имеет такое же (неопределенное) поведение , но также предлагает стандартный шаблон библиотеки, std::lessкоторый гарантированно возвращает то же самое, что и …

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.