Запитання з тегом «c»

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

6
(x | y) - y чому це не може бути просто x або навіть `x | 0`
Я читав код ядра, і в одному місці я побачив вираз всередині ifоператора, як if (value == (SPINLOCK_SHARED | 1) - 1) { ............ } де SPINLOCK_SHARED = 0x80000000є заздалегідь визначена константа. Цікаво, навіщо нам це потрібно (SPINLOCK_SHARED | 1) - 1- для перетворення типу? результат вираження буде 80000000-- такий …

5
Порядок оцінки індексів масиву (проти виразу) у С
Дивлячись на цей код: static int global_var = 0; int update_three(int val) { global_var = val; return 3; } int main() { int arr[5]; arr[global_var] = update_three(2); } Який запис масиву оновлюється? 0 або 2? Чи є в специфікації 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: …

2
Чому комутатор не оптимізований так само, як ланцюговий, якщо інший в c / c ++?
Наступна реалізація квадрата видає серію операторів cmp / je, як я би сподівався на ланцюжок, якщо заява: 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 …

6
Чому це твердження, що вимагається перенаправлення на тип-покарання покажчика, що відповідає компілятору попередження?
Я читав різні повідомлення про Stack Overflow 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є 3і …

7
Чому я не можу отримати доступ до вказівника на вказівник для масиву стека?
Будь ласка, подивіться на наступний код. Він намагається передати масив як char**a функції: #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); …
35 c 

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

7
Як працює порівняння вказівників у С? Чи нормально порівнювати покажчики, які не вказують на один і той же масив?
У розділі 5 K&R (Мова програмування на C) я прочитав наступне: По-перше, покажчики можуть бути порівняні за певних обставин. Якщо pі qвказують на елементи одного і того ж масиву, то співвідношення подобається ==, !=, <, >=і т.д. працювати належним чином. Що, мабуть, означає, що можна порівняти лише вказівники, що вказують …

4
Чи потоки копіюються під час виклику вилки?
Якщо у мене є програма, що працює з потоками і дзвонять 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) val) - 0x10000u; } int16_t …


4
Як називається (...) в 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-d масиву
Ось мій код: #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 з …

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.